Come aggiungere testo alla fine della riga quando il motivo è abbinato?


8

ingressi:

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

uscite:

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

Ho provato questo:

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

ma non ha funzionato.

Risposte:


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

Questo aggiungerà ;a alla fine se la riga contiene PATTERN.


3

L' $corrisponde alla fine della linea, in modo che il modello dovrebbe essere )$invece che $)come nel tuo esempio.

Inoltre, non è necessario xargsqui, è più sicuro usare la -execbandiera di fine:

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

Se la tua versione di find non funziona +alla fine, usa \;invece (grazie @ glenn-jackman ):

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

Infine, non è necessario per la gbandiera in un s/something$//linguaggio, in quanto esiste una sola occorrenza di $per riga.


1
Otterrai un po 'di efficienza -exec ... +invece di -exec ... \;, se la tua ricerca lo consente.
Glenn Jackman,

2

Supponendo che PATTERNsia effettivamente ( )e che qualcosa potrebbe andare tra il ( )e che non sono necessariamente alla fine della linea:

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


0

Provare:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.