Android

Jak używać sed do znajdowania i zastępowania ciągów w plikach

Редактируем текст в linux c SED

Редактируем текст в linux c SED

Spisu treści:

Anonim

Dość często podczas pracy z plikami tekstowymi musisz znaleźć i zamienić ciągi tekstowe w jednym lub kilku plikach.

sed jest trem ed itorem. Może wykonywać podstawowe operacje na plikach i strumieniach wejściowych, takich jak potoki. Za pomocą sed możesz wyszukiwać, znajdować i zamieniać, wstawiać i usuwać słowa i wiersze. Obsługuje podstawowe i rozszerzone wyrażenia regularne, które pozwalają dopasowywać złożone wzorce.

, porozmawiamy o tym, jak znaleźć i zamienić ciągi na sed . Pokażemy Ci również, jak przeprowadzić wyszukiwanie rekurencyjne i zamienić.

Znajdź i zamień ciąg na sed

Istnieje kilka wersji sed , z pewnymi różnicami funkcjonalnymi między nimi. macOS używa wersji BSD, a większość dystrybucji Linuksa jest domyślnie wstępnie zainstalowana GNU sed . Użyjemy wersji GNU.

Ogólna forma wyszukiwania i zamiany tekstu za pomocą sed ma następującą postać:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Domyślnie sed zapisuje swoje wyjście na standardowe wyjście. Ta opcja mówi sed do edycji plików na miejscu. Jeśli dostarczone zostanie rozszerzenie (np. -I.bak), zostanie utworzona kopia zapasowa oryginalnego pliku. s - Polecenie zastępcze, prawdopodobnie najczęściej używane polecenie w sed. / / / - Znak ogranicznika. Może to być dowolny znak, ale zwykle używany jest znak ukośnika ( / ). SEARCH_REGEX - Normalny ciąg lub wyrażenie regularne do wyszukania. REPLACEMENT - Ciąg zastępujący. g - Globalna flaga zastępcza. Domyślnie sed czyta plik linia po linii i zmienia tylko pierwsze wystąpienie SEARCH_REGEX w linii. Po dostarczeniu flagi zastępczej wszystkie wystąpienia zostaną zastąpione. INPUTFILE - nazwa pliku, na którym chcesz uruchomić polecenie.

Dobrą praktyką jest umieszczanie cudzysłowów wokół argumentu, aby meta-znaki powłoki nie rozwijały się.

Zobaczmy przykłady użycia polecenia sed do wyszukiwania i zastępowania tekstu w plikach niektórymi z najczęściej używanych opcji i flag.

Do celów demonstracyjnych użyjemy następującego pliku:

plik.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Globalna flaga zastępowania sed zastępuje wszystkie wystąpienia wzorca wyszukiwania:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Jak można zauważyć, w poprzednim przykładzie podciąg foo wewnątrz łańcucha foobar również został zastąpiony. Jeśli nie jest to pożądane zachowanie, użyj wyrażenia granicznego ze słowami ( \b ) na obu końcach ciągu wyszukiwania. Zapewnia to, że częściowe słowa nie są dopasowane.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Aby rozróżnić wielkość liter we wzorcu, użyj flagi I W poniższym przykładzie używamy zarówno flag g i I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

Łatwiejszą i bardziej czytelną opcją jest użycie innego znaku ogranicznika. Większość osób używa pionowego paska ( | ) lub dwukropka (:), ale możesz użyć dowolnego innego znaku:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Możesz także użyć wyrażeń regularnych. Na przykład, aby wyszukać wszystkie 3-cyfrowe liczby i zastąpić je ciągiem znaków, którego użyłbyś:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Inną przydatną funkcją sed jest to, że można użyć znaku handlowego & który odpowiada dopasowanemu wzorowi. Postać może być użyta wiele razy.

Na przykład jeśli chcesz dodać nawiasy klamrowe {} wokół każdej 3-cyfrowej liczby, wpisz:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Last but not least, zawsze dobrym pomysłem jest utworzenie kopii zapasowej podczas edycji pliku za pomocą sed . Aby to zrobić, podaj rozszerzenie opcji -i . Na przykład, aby edytować file.txt i zapisać oryginalny plik jako file.txt.bak , należy użyć:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Rekurencyjne Znajdź i zamień

Czasami chcesz rekurencyjnie przeszukiwać katalogi w poszukiwaniu plików zawierających ciąg i zastępować ciąg we wszystkich plikach. Można to zrobić za pomocą poleceń takich jak find lub grep aby rekurencyjnie znajdować pliki w katalogu i przesyłać nazwy plików do sed .

Następujące polecenie będzie rekurencyjnie wyszukiwać pliki w bieżącym katalogu roboczym i przekazywać nazwy plików do sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Aby uniknąć problemów z plikami zawierającymi spacje w ich nazwach, użyj opcji -print0 , która mówi find aby wydrukować nazwę pliku, a następnie znak null i -print0 wyjście do sed za pomocą xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Aby wykluczyć katalog, użyj opcji -not -path . Na przykład, jeśli zastępujesz ciąg w lokalnym repozytorium git, aby wykluczyć wszystkie pliki zaczynające się od kropki ( . ), Użyj:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Inną opcją jest użycie polecenia grep aby rekurencyjnie znaleźć wszystkie pliki zawierające wzorzec wyszukiwania, a następnie potokować nazwy plików do sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Wniosek

Chociaż może się to wydawać skomplikowane i złożone, na początku wyszukiwanie i zamiana tekstu w plikach na sed jest bardzo prosta.

Aby dowiedzieć się więcej o poleceniach, opcjach i flagach sed, odwiedź instrukcję GNU sed i samouczek Grymoire sed. Jeśli masz jakieś pytania lub uwagi, zostaw komentarz.

sed terminal