GNU/Linux >> Znalost Linux >  >> Linux

Jak používat Sed k vyhledání a nahrazení řetězce v souboru

Úvod

sed (s tream ed itor) je řádkově orientovaný nástroj pro analýzu a transformaci textu. sed příkaz používá jednoduchý programovací jazyk a regulární výrazy ke zpracování textových proudů a souborů. Nejpoužívanější funkce sed příkaz je substituce řetězce.

Tato příručka ukazuje, jak používat sed najít a nahradit řetězce pomocí příkladů.

Předpoklady

  • Přístup k příkazovému řádku/terminálu.
  • Textový soubor (tato příručka obsahuje soubor example.txt soubor).
  • Základní příkazy terminálu (stáhněte si náš bezplatný cheat sheet).

sed Najít a nahradit syntaxi

Syntaxe pro vyhledání a nahrazení textu pomocí sed příkaz je:

sed -i 's/<search regex>/<replacement>/g' <input file>

Příkaz se skládá z následujícího:

  • -i říká sed příkaz k zápisu výsledků do souboru namísto standardního výstupu.
  • s označuje náhradní příkaz.
  • / je nejběžnějším oddělovacím znakem. Příkaz také přijímá další znaky jako oddělovače, což je užitečné, když řetězec obsahuje lomítka.
  • <search regex> je vyhledávací parametr řetězce nebo regulárního výrazu.
  • <replacement> je náhradní text.
  • g je globální příznak nahrazení, který nahrazuje všechny výskyty řetězce namísto pouze prvního.
  • <input file> je soubor, ve kterém probíhá vyhledávání a nahrazování.

Jednoduché uvozovky pomáhají vyhnout se rozšíření metaznaků v shellu.

Verze BDS sed (který zahrnuje macOS) nepodporuje párování bez rozlišení velkých a malých písmen ani nahrazování souborů. Příkaz pro nahrazení souboru vypadá takto:

sed 's/<search regex>/<replacement>/g' <input file> > <output file>

Případně nainstalujte GNU verzi sed na macOS s homebrew:

brew install gnu-sed

Spusťte GNU sed příkaz takto:

gsed -i 's/<search regex>/<replacement>/g' <input file>

Nahraďte sed příkaz s gsed postupujte podle níže uvedených příkladů.

sed příklady nahrazení

Příklady z této příručky používají k nahrazení řetězců vzorový soubor.

1. Vytvořte ukázkový textový soubor:

nano example.txt

2. Přidejte následující obsah:

foobarbazfoobarbaz
foo bar baz foo bar baz
Foo Bar Baz Foo Bar Baz
FOO BAR BAZ FOO BAR BAZ
/foo/bar/baz /foo/bar/baz

Použijte soubor jako vstup pro otestování níže uvedených příkladů.

Poznámka :Za celých sed výukový program příkazů pro Linux, podívejte se na naši příručku příkazů sed Linux.

Nahradit první odpovídající řetězec

1. Chcete-li nahradit první nalezený výskyt slova bar s linuxem v každém řádku souboru spusťte:

sed -i 's/bar/linux/' example.txt

2. -i tag vloží změny do example.txt soubor. Zkontrolujte obsah souboru pomocí příkazu cat:

cat example.txt

Příkaz nahradí první výskyt bar s linuxem v každém řádku, včetně podřetězců. Shoda je přesná, ignoruje variace velkých písmen.

Globální nahrazení

Chcete-li nahradit každou shodu řetězce v souboru, přidejte g příznak do skriptu. Například:

sed -i 's/bar/linux/g' example.txt

Příkaz globálně nahradí každou instanci bar s linuxem v souboru.

Přiřazení a nahrazení všech případů

Chcete-li najít a nahradit všechny výskyty slova a ignorovat velká písmena, použijte I parametr:

sed -i 's/bar/linux/gI' example.txt

Příkaz nahradí všechny výskyty slova bar v textu bez ohledu na velká písmena.

Ignorovat podřetězce

Přidejte hranice slov (\b ) na sed příkaz ignorovat podřetězce při nahrazování řetězců v souboru. Například:

sed -i 's/\bbar\b/linux/gI' example.txt

Případně změňte oddělovač, aby byl příkaz snadněji čitelný:

sed -i 's:\bbar\b:linux:gI' example.txt

Příkaz ignoruje podřetězce a odpovídá pouze celému slovu.

Najít a nahradit řetězce lomítky

Escape znak lomítka najít a nahradit řetězec lomítky. Chcete-li například nahradit /foo/bar/baz pomocí /home/kb , použijte následující syntaxi:

sed -i 's/\/foo\/bar\/baz/\/home\/kb/g' example.txt

Případně změňte oddělovač, abyste se vyhnuli escapování:

sed -i 's:/foo/bar/baz:/home/kb:g' example.txt

Tuto syntaxi použijte k nahrazení cest a jiných řetězců lomítky.

Najít a nahradit regulárními výrazy

Vzor vyhledávání pro sed příkaz přijímá regulární výrazy, podobně jako grep regex. Chcete-li například porovnat všechna velká písmena a nahradit je 5 , použijte:

sed -i 's/[A-Z]/5/g' example.txt

Vzor regulárního výrazu pomáhá najít všechna velká písmena a nahradí je číslem v souboru.

Referenční nalezený řetězec

Použijte znak ampersand (& ) pro odkaz na nalezený řetězec. Chcete-li například přidat lomítko (/ ) před každou instancí foo v souboru použijte:

sed -i 's/foo/\/&/gI'example.txt

Místo přepisování vyhledávacího parametru & znak odkazuje na nalezený řetězec.

Vytvořit zálohu

Chcete-li vytvořit záložní soubor před přepsáním existujícího souboru, přidejte .bak parametr na -i tag.

sed -i.bak 's/foo/FOO/g' example.txt

Příkaz vytvoří zálohu (example.txt.bak ) před přepsáním originálu. Tuto metodu použijte, chcete-li zachovat kopii v původním formátu a vyhnout se přepsání.

Rekurzivní hledání a nahrazení

Pomocí příkazu find vyhledejte soubory a zkombinujte je s sed rekurzivně nahrazovat řetězce v souborech. Například:

find -name 'example*' -exec sed -i 's/[a-z]/5/gI' {} +

Příkaz najde všechny soubory začínající příkladem a provede sed příkaz na soubory. Provedený příkaz nahradí všechna písmena 5 , bez ohledu na velká písmena.

Závěr

Poté, co si projdete příklady v této příručce, víte, jak používat sed k nahrazení řetězců v souborech. sed command je výkonný nástroj pro manipulaci s textem s mnoha pokročilými funkcemi.

Dále se podívejte na příkaz awk nebo gawk, kde se dozvíte o dalších nástrojích pro manipulaci s textem.


Linux
  1. Jak použít Sed k výměně víceřádkového řetězce?

  2. Najít a nahradit ve skriptování shellu

  3. najít odpovídající text a nahradit další řádek

  1. Jak používat Awk a regulární výrazy k filtrování textu nebo řetězců v souborech

  2. Jak použít sed k nahrazení proměnné konfiguračního souboru?

  3. Najděte a nahraďte text v souboru mezi rozsahy řádků pomocí sed

  1. Použijte příkaz SED k vyhledání a nahrazení řetězce v souborech – Jak provést tento úkol na Ubuntu?

  2. Jak nahradit řetězec v souboru (souborech)?

  3. Jak nahradit řetězec řetězcem obsahujícím lomítko se Sed?