¿Cómo agregar texto al final de la línea cuando el patrón coincide?


8

entradas:

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

salidas:

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

Intenté esto:

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

Pero no funcionó.

Respuestas:


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

Esto agregará un ;al final si la línea contiene PATTERN.


3

El $coincide con el final de la línea, por lo que su patrón debe ser en )$lugar de $)como en su ejemplo.

Además, no necesita xargsaquí, es más seguro usar la -execbandera de fine:

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

Si su versión de find no funciona +al final, use \;en su lugar (gracias @ glenn-jackman ):

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

Finalmente, no hay necesidad de la gbandera en un s/something$//idioma, ya que solo hay una aparición $por línea.


1
Obtendrá algo de eficiencia en -exec ... +lugar de -exec ... \;, si su búsqueda lo permite.
Glenn Jackman

2

Suponiendo que eso PATTERNes realmente ( )y que algo podría interponerse entre ( )y que no están necesariamente al final de la línea:

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


0

Tratar:

sed --in-place '/PATTERN/s/.*/&;/' /path/to/file.txt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.