Wie füge ich Text am Zeilenende hinzu, wenn das Muster übereinstimmt?


8

Eingänge:

line1 with the PATTERN that contains ( ) 
line2 with the PATTERN that contains ( ) 
lineN with the PATTERN that contains ( ) 

Ausgänge:

line1 with the PATTERN that contains ( ) ;
line2 with the PATTERN that contains ( ) ;
...
lineN with the PATTERN that contains ( ) ;

Ich habe es versucht:

find . -name "test.txt" -print | xargs sed -i "/PATTERN/ s/$)/); /g"

aber es hat nicht funktioniert.

Antworten:


3
perl -ipe 's/$/;/ if /PATTERN/'

Dies fügt ;am Ende ein hinzu, wenn die Zeile enthält PATTERN.


3

Das $stimmt mit dem Ende der Leitung, so dass Ihr Muster sein soll , )$anstatt $)wie in Ihrem Beispiel.

Außerdem brauchen Sie xargshier nicht, es ist sicherer, die -execFlagge zu verwenden fine:

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' +

Wenn Ihre Version von find +am Ende nicht funktioniert , verwenden Sie \;stattdessen (danke @ glenn-jackman ):

find . -name test.txt -exec sed -i '/PATTERN/ s/)$/); /' '{}' \;

Schließlich ist das gFlag in einer s/something$//Redewendung nicht erforderlich , da es nur ein Vorkommen $pro Zeile gibt.


1
Sie gewinnen etwas Effizienz mit -exec ... +statt -exec ... \;, wenn Ihr Fund es erlaubt.
Glenn Jackman

2

Angenommen, das PATTERNist tatsächlich so ( )und es könnte etwas zwischen dem ( )und dem liegen, dass sie nicht unbedingt am Ende der Zeile stehen:

sed -i '/(.*)/ s/$/ ;/' test.txt


0

Versuchen:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.