¿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ó.

usuario3342338
fuente

Respuestas:

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

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

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

janos
fuente
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
Graeme
fuente
1

Usando ex(que es equivalente a vi -e/ vim -e).

Un archivo:

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

Todos los test.txtarchivos de forma recursiva:

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

Nota: Asegúrese de que la opción global ( **) esté habilitada por: shopt -s globstarsi su shell lo admite.

Nota: El :bufdocomando no es POSIX .

kenorb
fuente
note que bufdo no es POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Tratar:

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