Ersetzen mehrerer Zeilen in sed oder awk [geschlossen]

9

Ich versuche, mit sed oder awk 5 Zeilen in einer smb-Datei zu ersetzen, aber ich habe keine Ahnung, wie ich mit den Zeilenumbrüchen umgehen soll.

Glisignoli
quelle
6
Natürlich können sed und awk das, aber ich habe ein wenig Probleme, genau zu verstehen, was Ihre Frage ist. Was genau macht dir Ärger? Neue Zeilen einfügen? Ersetzen sie?
Frabjous

Antworten:

19

Sed ist ziemlich schlecht darin, weil es eine Leitung nach der anderen betreibt. Die einzige anständige Technik, die ich jemals gesehen habe, ist diese , bei der die gesamte Datei im Haltepuffer von sed gespeichert und dann auf einmal bearbeitet wird:

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

Wenn Sie können, ist es viel einfacher, Perl zu verwenden, um dies zu erreichen:

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

searchkann \ns enthalten , um Zeilenumbrüche darzustellen

Michael Mrozek
quelle
1
+1 für den sedMultiliner.
Lazer
Können Sie erklären, was die Befehlszeilenargumente für Perl tun?
Michael
1
@Michael -0setzt das Datensatztrennzeichen auf null, sodass die gesamte Datei auf einmal anstatt zeilenweise gelesen wird. -pLässt das Ergebnis nach der Ersetzung drucken. -emuss das nächste Argument als Ausdruck verwendet werden, und s/search/replace/ist dieser Ausdruck
Michael Mrozek