Sed Ersatz durch einen Satz in mehreren Zeilen

11

Ich bin neu in der Verwendung von sed, habe aber sed's s/..../..../(Ersatz) experimentiert , um einen vollständigen Satz zu ändern, wenn er sich in einer Zeile befindet. Mir ist jedoch keine alternative Lösung zum Ändern eines Satzes bekannt, der möglicherweise in zwei Zeilen getrennt wurde, z.

Dies:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

ist eigentlich so geschrieben:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

Wie können Sie dies erkennen oder codieren, um den gesamten Satz zu ersetzen, selbst wenn er in zwei statt in einer Zeile steht?

DᴀʀᴛʜVᴀᴅᴇʀ
quelle
Great sed Nachschlagewerk: Definitive Anleitung zu sed Tutorial und Nachschlagewerk von Daniel A. Goldman ISBN: 978-1-939824-01-1 (EPUB-Version) 08148804441822
Joe

Antworten:

16

Der folgende Befehl funktioniert in beiden Situationen:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Weitere Erklärungen: Wie kann ich sed verwenden, um eine mehrzeilige Zeichenfolge zu ersetzen?

Radu Rădeanu
quelle
3
@ Gilles Ich verstehe deine guten Absichten, aber bitte versuche vorher zu testen, um meine Antwort durcheinander zu bringen. Wenn Sie eine andere Meinung haben, ist es besser, eine andere Antwort hinzuzufügen oder einen Kommentar zu hinterlassen.
Radu Rădeanu
Willkommen bei Stack Exchange. Diese Seite wird gemeinsam bearbeitet. Wenn Sie mit der Idee, dass Ihre Beiträge von anderen vertrauenswürdigen Benutzern gemeinsam bearbeitet werden, nicht zufrieden sind, ist dies möglicherweise nicht die richtige Website für Sie. Ich habe festgestellt, dass Ihr Code mehr als die beabsichtigte Phrase ersetzt hat, also habe ich die Phrase in bearbeitet.
Gilles 'SO - hör auf böse zu sein'
@ Gilles Bitte, du musst nicht schelmisch sein. Sie sollten auch beachten, dass Ihr "Code" absolut nichts ersetzt hat . Wie gesagt, ich verstehe Ihre guten Absichten. Aus meinem Beispiel nehme ich an, dass das OP zu verstehen versteht, wie man durch einen Satz in mehreren Zeilen mit sednichts mehr ersetzt. Und das ist die Titelfrage. Der Titel handelt nicht von perl.
Radu Rădeanu
Nein, der Code, den ich gepostet habe, funktioniert. (Außer wenn Loremes in der letzten Zeile steht, ein Fehler, den es mit Ihrer Version teilt.)
Gilles 'SO - hör auf böse zu sein'
Dieses Beispiel funktioniert nicht, wenn es 3 oder mehr Textzeilen gibt :(
artnikpro
12

Während sed Muster auf mehreren Zeilen abgleichen kann (mithilfe der Befehle Noder Hzum Anhängen aufeinanderfolgender Zeilen vor dem Abgleich), liegt dies weit außerhalb seiner Komfortzone. Versuchen Sie es nur, wenn Sie Schmerzen mögen.

Perl kann solche Dinge gut machen. Verwenden Sie den -pSchalter , um die Standardeingabe einzeln zu verarbeiten und den geänderten Datensatz zu drucken (à la sed), und -000um den Absatzmodus zu aktivieren (bei dem Datensätze durch Leerzeilen getrennt sind). \sEntspricht in einem regulären Ausdruck jedem Leerzeichen einschließlich einer neuen Zeile.

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

Wenn Sie eine neue Zeile in den Ersatztext einfügen möchten, wenn das Original eine enthält, ist dies komplizierter. Wie das geht, hängt von Ihren Anforderungen ab, wo die Newline platziert werden soll.

Gilles 'SO - hör auf böse zu sein'
quelle
@terdon Ah, ich wollte mehrere Leerzeichen zulassen, habe es aber vergessen. Danke, behoben.
Gilles 'SO - hör auf böse zu sein'
Die Frage ist ungefähr sed. Es ist auch mit markiert sed, nicht mit perl.
Radu Rădeanu
0

sed kann nicht einfach über mehrere Zeilen lesen. Verwenden Sie perl -i -0pe 's/.../.../...'stattdessen.

Machen
quelle
7
sed kann über mehrere Zeilen lesen!
Radu Rădeanu
3
@ RaduRădeanu Technisch ja. Aber die Mühe lohnt sich selten.
Gilles 'SO - hör auf böse zu sein'
3
@ Gilles Wenn die Verwendung perlfür Sie einfacher ist, bedeutet dies nicht, dass sich seddie Mühe selten lohnt.
Radu Rădeanu