sed z wieloma wyrażeniami do dyskusji w miejscu


24

Próbuję zastąpić wiele słów w pliku za pomocą sed -i #expression1 #expression2

plik

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

Wyjście (pożądane)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

Wypróbowania

Mogę uzyskać następujące dane wyjściowe za pomocą sed -i2 razy.

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

Czy mogę w jakikolwiek sposób uczynić to pojedynczym poleceniem w miejscu, takim jak

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

Kiedy wypróbowałem powyższy kod, trwa on s/item/stuff/gjako plik i próbuję nad nim pracować.


Jeśli twoje pliki są podobne do powyższego przykładu (tzn. Mają ten sam wzór), możesz to zrobić za pomocą jednego zastąpienia:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

Odpowiedzi:


26

W zależności od wersji sedtwojego systemu możesz to zrobić

sed -i 's/Some/any/; s/item/stuff/' file

Nie potrzebujesz tutaj gpo ostatnim ukośniku w spoleceniu, ponieważ wykonujesz tylko jedną zamianę w wierszu.

Alternatywnie:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

-iOpcja mówi seddo edytowania plików w miejscu; jeśli istnieją znaki natychmiast po -iczym sedwykonuje kopię zapasową oryginalnego pliku i wykorzystuje te znaki jako rozszerzenie pliku kopii zapasowej użytkownika. Na przykład,

sed -i.bak 's/Some/any/; s/item/stuff/' file

lub

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

zmodyfikuje file, zapisując oryginał w file.bak.

Oczywiście w systemie uniksowym (lub uniksopodobnym) zwykle używamy „~” zamiast „.bak”, więc

sed -i~ 's/Some/any/;s/item/stuff/' file

2
Zauważ, że opisujesz wariant GNU. Wariant BSD (jak we FreeBSD lub OS / X) wymaga argumentu -i. Więc sed -i '' 's/a/b/;s/c/d/' filealbo sed -i .back 's/a/b/;s/c/d/'czy sed -i.back 's/a/b/;s/c/d/'nie. Inne sedimplementacje zazwyczaj nie obsługują -i.
Stéphane Chazelas,

Dzięki @ StéphaneChazelas za wyjaśnienie tego. Wydaje mi się, że powinienem był bardziej wyraźnie powiedzieć, że w GNU sed nie może być spacji między -irozszerzeniem a rozszerzeniem.
PM 2,

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpwyniki sed: -e expression #1, char 141: unterminated s 'command`
alhelal

@alhelal Przepraszamy, komentarze nie są odpowiednim miejscem do zadawania pytań. Ale tak czy inaczej, twoje ostatnie spolecenie nie ma ostatecznego /.
PM

@ PM2Ring, ponieważ nie zauważyłem, że zgaduję, że ma to związek z Twoim rozwiązaniem. Jednak dziękuję.
alhelal

10

Możesz łączyć wyrażenia sed razem z „;”

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

5

Wiele wyrażeń za pomocą wielu -eopcji:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

lub możesz użyć tylko jednego:

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

Powinieneś podać rozszerzenie pliku kopii zapasowej, ponieważ kiedy niektóre implementacje sed, takie jak OSX sed , nie działają z pustym rozszerzeniem (musisz użyć, sed -i ''aby zastąpić oryginalne pliki).


1

Możesz używać Vima w trybie Ex:

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % wybierz wszystkie linie

  2. s zastąpić

  3. x Zapisz i zamknij

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.