Wprowadź wiele zmian za pomocą jednego połączenia z sed

16

Próbuję użyć sed do edycji pliku konfiguracyjnego. Jest kilka linii, które chciałbym zmienić. Wiem, że pod Linuksem sed -ipozwala na wprowadzanie zmian w miejscu, ale wymaga zapisania w pliku kopii zapasowej. Chciałbym jednak uniknąć posiadania wielu plików kopii zapasowych i wprowadzić wszystkie moje zmiany w jednym miejscu.

Czy istnieje sposób, aby to zrobić, sed -iczy istnieje lepsza alternatywa?

rclark
źródło

Odpowiedzi:

22

Możesz powiedzieć, sedaby wykonać wiele operacji, po prostu powtarzając -e(lub -fjeśli twój skrypt znajduje się w pliku).

sed -i -e 's/a/b/g' -e 's/b/d/g' filewprowadza obie zmiany w jednym pliku o nazwie file, w miejscu. Bez pliku kopii zapasowej.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' filewprowadza obie zmiany w jednym pliku o nazwie file, w miejscu. Z pojedynczym plikiem kopii zapasowej o nazwie filebak.

EightBitTony
źródło
2
Pamiętaj, że sekwencja ma znaczenie. W podanym powyżej przykładowym poleceniu wszystkie wystąpienia litery asą zamieniane b, a następnie wszystkie wystąpienia bsą przekształcane w d. Można zrobić to samo z sed -i -e 's/a\|b/d/g' file-Skręć wszystkich wystąpień albo aczy bjęzyk d.
Wildcard,
4

Inną alternatywą jest expoprzednik vi. To jest rzeczywiście narzędzie POSIX z wyboru w miejscu skryptów edycji plików; jest wyjątkowo elastyczny i przenośniejszy niż Perl. (Jeśli pozostaniesz poza światem Windows, jest bez wątpienia bardziej przenośny niż Perl.)sed -i

Istnieje względny brak w tym Stack Exchange Network przykładowych poleceń za pomocą ex, przynajmniej w porównaniu z nadmiarem przykład poleceniach sed, awkoraz Perl. Jednak sam zagłębiłem się w specyfikacje POSIXex i od tego czasu biję w tym celu bęben. Napisałem wiele odpowiedzi, używając exzarówno tutaj, jak i na stosie vi / Vim:

Dalsza lektura:

Dzika karta
źródło
3

Oprócz korzystania z wielu -eopcji, możesz także rozdzielić polecenia sed w jednym skrypcie sed, używając znaków nowej linii lub średników.

Jest tak w przypadku, gdy ten skrypt jest jednowierszowy w wierszu poleceń, czy plik skryptu.

na przykład

sed -e 's/a/b/g ; s/b/d/g' file

Znaki spacji wokół ;są opcjonalne. Użyłem ich tutaj, aby upewnić się, że średnik wyróżnia się (ogólnie, z wyjątkiem znaków oddzielających wiersze, białe znaki między poleceniami są ignorowane ... ale nie zapominaj, że białe znaki w poleceniach mogą być i zwykle są znaczący).

lub:

sed -e 's/a/b/g
        s/b/d/g' file
cas
źródło