Pregunta 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: Me gusta esto:

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

74
2018-03-06 20:54


origen


Respuestas:


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 sed común usando $ para el final de una linea

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

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

O puede redirigirlo a otro archivo

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

138
2018-03-06 21:00



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 combinada.


7
2018-03-06 21:00



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, luego realice las acciones descritas en {}.
  • En este caso: /^all:/ {$0=$0" anotherthing"} si la línea comienza (representada por ^) con all:, luego anexar anotherthing a la linea
  • 1 como una condición verdadera, desencadena la acción predeterminada de awk: imprime 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

5
2018-01-25 16:47



En bash:

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

4
2018-03-06 21:11



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.


3
2018-03-06 21:11



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'


1
2018-06-04 20:50