Zamiana wielu linii w sed lub awk [zamknięte]

9

Próbuję użyć sed lub awk, aby zastąpić 5 wierszy w pliku smb, ale po prostu nie mam pojęcia, jak sobie radzić z nowymi wierszami.

glisignoli
źródło
6
Oczywiście sed i awk mogą to zrobić, ale mam mały problem ze zrozumieniem, jakie jest twoje pytanie. Co dokładnie powoduje problemy? Wstawiać nowe linie? Zastępujesz je?
frabjous

Odpowiedzi:

19

Sed jest w tym dość zły, ponieważ obsługuje jedną linię na raz. Jedyną przyzwoitą techniką, jaką kiedykolwiek widziałem, aby to zrobić, jest ta , która polega na przechowywaniu całego pliku w buforze wstrzymania sed, a następnie operowaniu nim na raz:

sed -n '1h;1!H;${g;s/search/replace/;p;}'

Jeśli możesz, o wiele łatwiej jest użyć perla, aby to zrobić:

perl -0pe 's/search/replace/'

searchmoże zawierać \ns, aby reprezentować znaki nowej linii

Michał Mrożek
źródło
1
+1 za sedmultiliner.
Lazer,
Czy potrafisz wyjaśnić, co robi wiersz poleceń?
Michael
1
@ Michael -0ustawia separator rekordów na null, więc cały plik będzie odczytywany jednocześnie zamiast wiersza po wierszu. -ppowoduje wydruk wyniku po zamianie. -eczy trzeba użyć następnego argumentu jako wyrażenia, i s/search/replace/jest to wyrażenie
Michael Mrozek