Cómo agregar al final de las líneas que contienen un patrón con sed o awk?

Aquí está el archivo de ejemplo:

somestuff... all: thing otherthing some other stuff 

Lo que quiero hacer es agregar a la línea que comienza con all: así:

 somestuff... all: thing otherthing anotherthing some other stuff 

Esto funciona para mí

 sed '/^all:/ s/$/ anotherthing/' file 

La primera parte es un patrón para encontrar y la segunda parte es una sustitución de sed común usando $ para el final de una línea.

Si desea cambiar el archivo durante el proceso, use la opción -i

 sed -i '/^all:/ s/$/ anotherthing/' file 

O puede redirigirlo a otro archivo

 sed '/^all:/ s/$/ anotherthing/' file > output 

Esto debería funcionar para ti

 sed -e 's_^all: .*_& anotherthing_' 

Usando s comando (sustituto) puede buscar una línea que satisfaga una expresión regular. En el comando de arriba, & representa la cadena coincidente.

Puede agregar el texto a $0 en awk si coincide con la condición:

 awk '/^all:/ {$0=$0" anotherthing"} 1' file 

Explicación

  • /patt/ {...} si la línea coincide con el patrón dado por patt , entonces realice las acciones descritas dentro de {} .
  • En este caso: /^all:/ {$0=$0" anotherthing"} si la línea comienza (representada por ^ ) con all: luego agregue anotherthing a la línea.
  • 1 como una condición verdadera, desencadena la acción predeterminada de awk : imprima la línea actual ( print $0 ). Esto sucederá siempre, por lo que imprimirá la línea original o la línea modificada.

Prueba

Para su entrada dada, regresa:

 somestuff... all: thing otherthing anotherthing some other stuff 

Tenga en cuenta que también puede proporcionar el texto para agregar en una variable:

 $ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file somestuff... all: thing otherthing EXTRA TEXT some other stuff 

En bash:

 while read -r line ; do [[ $line == all:* ]] && line+=" anotherthing" echo "$line" done < filename 

Solución con awk:

 awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file 

Simplemente: si la fila comienza con all imprima la fila más “anotherrthing”, de lo contrario imprima solo la fila.

Aquí hay otra solución simple que usa sed.

 $ sed -i 's/all.*/& anotherthing/g' filename.txt 

Explicación:

todo. * significa que todas las líneas comenzaron con ‘todo’.

& representa la coincidencia (es decir, la línea completa que comienza con ‘todo’)

luego sed reemplaza el primero con el último y agrega la palabra ‘anotherrthing’