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?
command-line
sed
DᴀʀᴛʜVᴀᴅᴇʀ
quelle
quelle
Antworten:
Der folgende Befehl funktioniert in beiden Situationen:
Weitere Erklärungen: Wie kann ich sed verwenden, um eine mehrzeilige Zeichenfolge zu ersetzen?
quelle
sed
nichts mehr ersetzt. Und das ist die Titelfrage. Der Titel handelt nicht vonperl
.Lorem
es in der letzten Zeile steht, ein Fehler, den es mit Ihrer Version teilt.)Während sed Muster auf mehreren Zeilen abgleichen kann (mithilfe der Befehle
N
oderH
zum 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
-p
Schalter , um die Standardeingabe einzeln zu verarbeiten und den geänderten Datensatz zu drucken (à la sed), und-000
um den Absatzmodus zu aktivieren (bei dem Datensätze durch Leerzeilen getrennt sind).\s
Entspricht in einem regulären Ausdruck jedem Leerzeichen einschließlich einer neuen Zeile.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.
quelle
sed
. Es ist auch mit markiertsed
, nicht mitperl
.sed kann nicht einfach über mehrere Zeilen lesen. Verwenden Sie
perl -i -0pe 's/.../.../...'
stattdessen.quelle
perl
für Sie einfacher ist, bedeutet dies nicht, dass sichsed
die Mühe selten lohnt.