2017-01-16 1 views
-1

sample_file:Suchen und Ersetzen Einzeiler erhalten Zeilenumbrüche

this is a test line! 
this is a test line! 
this is a test line! 
this is a test line! 

Ich bin ein Perl-Einzeiler mit Text wie folgt zu ersetzen:

perl -pi -e 's{this(.*)\s}{\n\1\n}i && s{.*\n}{}' sample_file 

Der this(.*)\s Teil und \1 Teil sind Variable und ich kann das nicht ändern (es kommt von Benutzereingaben).

Mein Problem ist, dass ich den {\n\1\n} Teil abhängig davon anpassen muss, ob die erste Regex das Newline-Zeichen enthält.

Zum Beispiel, wenn die erste Regex ist {this(.*)\s} Ich brauche {\n\1\n}, aber wenn die erste wie {(.*)a test} ist ich brauche {\n\1}.

Wie kann ich überprüfen, ob das Newline-Zeichen verloren ist, und es bei Bedarf zurückstellen?

+0

Es wird nicht an erster Stelle funktionieren - '-pi' wird Ihr Ding trotzdem Zeile für Zeile durchlaufen lassen. – Sobrique

+0

Sie beginnen am falschen Ort und Ihre Frage ist irreführend. Ich schlage vor, dass Sie eine andere Frage stellen, zeigen, was Sie versucht haben, und beschreiben Sie die Transformation, die Sie auf Ihre Datei anwenden möchten. – Borodin

+0

Sie sollten Ihre Benutzer wirklich nicht bitten, Regex-Muster einzugeben! – Borodin

Antwort

1

Im Allgemeinen möchten Sie chomp Eingänge Zeilen, und fügen Sie eine neue Zeile zu den Ausgangsleitungen. -l (in Verbindung mit -n oder -p) wird beides tun.

Zum Beispiel ersetzt das Nachfolgende nicht die neue Zeile mit !, weil es durch -l entfernt wurde (und anschließend von der print wieder hinzugefügt wurde).

perl -i -ple's/\s/!/g' file 

By the way, \1 ("entspricht, was der erste Fang gefangen") macht keinen Sinn, in einer Substitution. Sie möchten $1 (wie -w würde Ihnen sagen).

+0

Danke, im Grunde -l löst meine Probleme! – zjeraar