Úvod
Sed je zkratka pro S tream ED itor. Je to linuxový příkaz používaný k vyhledávání, hledání a nahrazování nebo vkládání a mazání slov a řádků v textovém souboru.
Nejčastějším případem použití příkazu Sed je vyhledání a nahrazení řetězců v souborech. Při použití příkazu Sed můžete upravovat soubory, aniž byste je otevírali.
Tento článek vysvětlí podrobnosti použití příkazu Sed k vyhledání a nahrazení řetězců v souborech.
Všechny příklady v tomto tutoriálu byly provedeny na Ubuntu 20.04.
Najít a nahradit
Ve výchozím nastavení je Sed nainstalován ve většině distribucí Linuxu. Instalaci Sed na vašem systému Linux můžete ověřit spuštěním:
$ sed --v
Výstup bude něco takového:
Základní syntaxe použití příkazu Sed k vyhledání a nahrazení textu je:
$ sed -i 's/Search_pattern/Replacement_pattern/g' FILE
Ve kterém:
-i:Tato volba umožňuje příkazu Sed upravovat soubory na místě místo zápisu výstupu na standardní výstup.
s:To znamená náhradní.
/ /:Oddělovací znaky.
g:Je to globální příznak nahrazení.
FILE:Soubor, se kterým chcete manipulovat pomocí příkazu Sed.
Důrazně se doporučuje umístit vyhledávací vzor, náhradní vzor a další argumenty do uvozovek.
Zde je například textový soubor, který byl použit pro demonstraci:
567 Test test test
test /bin/zsh linuxways.net testbar 789
Chcete-li nahradit všechna „testovací“ slova slovy „linux“, spusťte následující příkaz:
$ sed -i 's/test/linux/g' test.txt
Výstup:
Pokud nepoužijete příznak g, bude nahrazen pouze první výskyt vyhledávacího vzoru v každém řádku:
$ sed -i 's/test/linux/' test.txt
Výstup:
Jak vidíte, v předchozím příkladu je také umístěn test podřetězce uvnitř řetězce testbar. Pokud nechcete nahradit podřetězec ve vzoru vyhledávání, umístěte vzor vyhledávání mezi dvě hranice slova \b:
$ sed -i 's/\btest\b/linux/g' test.txt
Výstup:
Aby se ve vyhledávacím vzoru nerozlišovala malá a velká písmena, použijte příznak I:
$ sed -i 's/test/linux/gI' test.txt
Výstup:
Ve světě Linuxu se setkáme s mnoha případy použití, které mají oddělovací znaky v textových souborech. K oddělení oddělovacích znaků musíme použít zpětné lomítko \. Chcete-li například nahradit /bin/zsh /usr/bin/bash, spusťte:
$ sed -i 's/\/bin\/zsh/\/usr\/bin\/bash/g' test.txt
Výstup:
Rekurzivní hledání a nahrazení
V mnoha případech chcete rekurzivně vyhledávat v adresářích soubory, které mají určitý řetězec, a nahradit tento řetězec ve všech souborech.
Například následující příkaz vyhledá a nahradí řetězec ‚way‘ řetězcem ‚road‘ ve všech souborech v aktuálním adresáři.
$ find . -type f -exec sed -i 's/way/road/g' {} +
Pokud názvy souborů obsahují mezery, použijte volbu -print0:
$ find . -type f -print0 | xargs -0 sed -i 's/way/road/g'
Chcete-li vyhledat a nahradit řetězec pouze u souborů, které mají určitou příponu, spusťte:
$ find . -type f -name "*.java" -print0 | xargs -0 sed -i 's/way/road/g'
Závěr
Prošli jste některými běžnými příklady použití příkazu Sed. Vyhledávání a nahrazování řetězce textu v souboru pomocí příkazu Sed není složité, jak si představujete.
Pokud máte nějaké obavy, dejte mi vědět v sekci komentářů.