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.

user3342338
quelle

Antworten:

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

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

michas
quelle
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.

Janos
quelle
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
Graeme
quelle
1

Verwenden von ex(was vi -e/ entspricht vim -e).

Eine Datei:

ex +"g/local/s/$/;/g" -cwq foo.txt

Alle test.txtDateien rekursiv:

ex +"bufdo g/local/s/$/;/g" -cxa **/test.txt

Hinweis: Stellen Sie sicher, dass die Globbing-Option ( **) aktiviert ist durch: shopt -s globstarWenn Ihre Shell dies unterstützt.

Hinweis: Der :bufdoBefehl ist nicht POSIX .

Kenorb
quelle
Hinweis Bufdo ist nicht POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Versuchen:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
DopeGhoti
quelle