Bagaimana cara menambahkan teks ke garis akhir ketika pola dicocokkan?

8

input:

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

output:

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

Saya mencoba ini:

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

tapi itu tidak berhasil.

pengguna3342338
sumber

Jawaban:

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

Ini akan menambahkan ;di akhir jika baris berisi PATTERN.

michas
sumber
3

Yang $cocok dengan akhir baris, jadi pola Anda seharusnya )$bukan $)seperti pada contoh Anda.

Juga, Anda tidak perlu di xargssini, lebih aman untuk menggunakan -execbendera fine:

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

Jika versi pencarian Anda tidak berfungsi +di akhir, gunakan \;sebagai gantinya (terima kasih @ glenn-jackman ):

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

Akhirnya, tidak perlu untuk gbendera dalam s/something$//idiom, karena hanya ada satu kemunculan $per baris.

janos
sumber
1
Anda akan mendapatkan efisiensi dengan -exec ... +alih - alih -exec ... \;, jika temuan Anda memungkinkan.
glenn jackman
2

Dengan asumsi itu PATTERNsebenarnya ( )dan sesuatu mungkin terjadi di antara ( )dan bahwa mereka tidak harus di akhir baris:

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

Menggunakan ex(yang setara dengan vi -e/ vim -e).

Satu file:

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

Semua test.txtfile secara rekursif:

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

Catatan: Pastikan opsi globbing ( **) diaktifkan oleh: shopt -s globstarjika shell Anda mendukungnya.

Catatan: :bufdoPerintah ini bukan POSIX .

kenorb
sumber
0

Mencoba:

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