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
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
Antworten:
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:
Wenn Sie können, ist es viel einfacher, Perl zu verwenden, um dies zu erreichen:
search
kann\n
s enthalten , um Zeilenumbrüche darzustellenquelle
sed
Multiliner.-0
setzt das Datensatztrennzeichen auf null, sodass die gesamte Datei auf einmal anstatt zeilenweise gelesen wird.-p
Lässt das Ergebnis nach der Ersetzung drucken.-e
muss das nächste Argument als Ausdruck verwendet werden, unds/search/replace/
ist dieser Ausdruck