Comment ajouter du texte à la fin de la ligne lorsque le motif correspond?

8

contributions:

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

les sorties:

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

J'ai essayé ceci:

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

mais ça n'a pas marché.

user3342338
la source

Réponses:

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

Cela ajoutera un ;à la fin si la ligne contient PATTERN.

michas
la source
3

Le $correspond à la fin de la ligne, donc votre modèle devrait être )$au lieu de $)comme dans votre exemple.

De plus, vous n'avez pas besoin xargsici, il est plus sûr d'utiliser le -execdrapeau de fine:

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

Si votre version de find ne fonctionne pas +à la fin, utilisez \;plutôt (merci @ glenn-jackman ):

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

Enfin, l' gindicateur n'est pas nécessaire dans un s/something$//idiome, car il n'y a qu'une seule occurrence de $par ligne.

janos
la source
1
Vous gagnerez en efficacité au -exec ... +lieu de -exec ... \;, si votre découverte le permet.
glenn jackman
2

En supposant que PATTERNc'est effectivement le cas ( )et que quelque chose pourrait se situer entre le ( )et qu'ils ne sont pas nécessairement à la fin de la ligne:

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

Utilisation ex(qui équivaut à vi -e/ vim -e).

Un fichier:

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

Tous les test.txtfichiers récursivement:

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

Remarque: assurez-vous que l' option globbing ( **) est activée par: shopt -s globstarsi votre shell la prend en charge.

Remarque: la :bufdocommande n'est pas POSIX .

kenorb
la source
note bufdo n'est pas POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Essayer:

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