Ich habe eine große Datei mit Sonderzeichen. Dort gibt es einen mehrzeiligen Code, den ich ersetzen möchte sed
.
Dies:
text = "\
------ ------\n\n\
This message was automatically generated by email software\n\
The delivery of your message has not been affected.\n\n\
------ ------\n\n"
Muss sich in Folgendes verwandeln:
text = ""
Ich habe den folgenden Code ausprobiert, aber kein Glück:
sed -i '/ text = "*/ {N; s/ text = .*affected.\./ text = ""/g}' /etc/exim.conf
Es ersetzt nichts und zeigt keine Fehlermeldungen an
Ich habe damit gespielt, aber alles, was ich versuche, funktioniert nicht.
text-processing
sed
perl
Klinge19899
quelle
quelle
sed
oder sind Sie offen für andere Tools? Kann es"
innerhalb destext=
Blocks sein? Kann es andere Fälletext =
in Ihrer Datei geben? Wird es immer 4 Textzeilen geben oder kann es mehr / weniger geben?sed
oder alles, was keine Installation auf einem CentOS-Server erfordert. Out of the Box Werkzeugetext =
im Ordner, das Ergebnis muss seintext = ""
. Die Dateien enthalten 891 Codezeilen. Also, es muss den anderen Text respektieren.text = ""
. Wie in meiner Frage zu sehen.Antworten:
Perl zur Rettung:
-i~
bearbeitet die Datei "an Ort und Stelle" und hinterlässt eine Sicherungskopie-0777
liest die gesamte Datei auf einmal, nicht zeilenweiseDie Ersetzung
s///
funktioniert ähnlich wie in sed (dh sie stimmt überein,text = "
gefolgt von etwas anderem als doppelten Anführungszeichen bis zu einem doppelten Anführungszeichen), aber in diesem Fall funktioniert sie für die gesamte Datei.quelle
Sie müssen den Musterraum überprüfen und die
N
ext-Linie weiter ziehen, wenn sie nicht übereinstimmt, zmit
gnu sed
kannst du es schreiben alsDas ist jedoch nicht sehr effizient. Wählen Sie besser den Bereich aus
/text = "/,/"/
, ändern Sie die erste Zeile und löschen Sie den Rest:Auch hier können
gnu sed
Sie es als Einzeiler schreiben:quelle
Persönlich würde ich dies in Perl tun. Wenn wir davon ausgehen können, dass es
"
vor dem Abschluss keine gibt"
, können Sie Folgendes tun:Der
-0
schlürft die gesamte Datei und liest sie in den Speicher. Das-p
bedeutet "jede Zeile drucken (hier ist eine" Zeile "die gesamte Datei), nachdem das von gegebene Skript angewendet wurde-e
". Das Skript selbst ist ein einfacher Substitutionsoperator. Es erfasst die Zeichenfolge,text
gefolgt von 0 oder mehr Leerzeichen, einem=
und 0 oder mehr Leerzeichen (text\s*=\s*
) und speichert sie unter$1
. Dann wird das erfasste Muster sowie die kürzeste Zeichenfolge in Anführungszeichen durch das Muster ($1
) und ersetzt""
. Dies
Flagge macht.
passende Zeilenumbrüche.quelle
-00
liest Absätze ein, nicht die ganze Datei ( ref ). Wenn der Text in Anführungszeichen eine Leerzeile enthält, stimmt der reguläre Ausdruck nicht überein.perl -00ne 'print;exit'
. Und ich habe immer noch die falsche in meine Antwort eingefügt! Danke, jetzt behoben.