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

89

Aquí hay un archivo de ejemplo:

somestuff...
all: thing otherthing
some other stuff

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

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

Respuestas:

166

Esto funciona para mi

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

La primera parte es un patrón para encontrar y la segunda parte es una sustitución de sed ordinaria que se usa $para el final de una línea.

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

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

O puede redirigirlo a otro archivo

sed '/^all:/ s/$/ anotherthing/' file > output
user219882
fuente
Simplemente agregar algo conduce a una nueva línea, reemplazar es la forma correcta.
zhy
10

Esto debería funcionar para ti

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

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

izidor
fuente
9

Puede agregar el texto $0en 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, realice las acciones descritas en ella {}.
  • En este caso: /^all:/ {$0=$0" anotherthing"}si la línea comienza (representada por ^) con all:, añádalo anotherthinga la línea.
  • 1como condición verdadera, activa la acción predeterminada de awk: imprimir la línea actual ( print $0). Esto sucederá siempre, por lo que imprimirá la línea original o la modificada.

Prueba

Para su entrada dada, devuelve:

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
fedorqui 'ASÍ que deja de hacer daño'
fuente
En Solaris obtendrá el error:awk: can't set $0
partir del
@ceving entonces puede usar /usr/xpg4/bin/awkcuál es el awk "bueno".
fedorqui 'SO deja de dañar'
6

En bash:

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

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

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

Explicación:

all. * significa que todas las líneas comenzaron con 'all'.

& representar la coincidencia (es decir, la línea completa que comienza con 'todos')

luego sed reemplace el primero con el posterior y agrega la palabra 'otra'

chenchuk
fuente
3

Solución con awk:

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

Simplemente: si la fila comienza con allimprimir la fila más "otro", de lo contrario imprima sólo la fila.

Manlio
fuente
4
Puede acortarlo a:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman
2
@Prometheus, un script awk se compone de condition {actions}pares. Si conditionse omite, las acciones se realizan para cada registro. Si {actions}se omiten y la condición se evalúa como verdadera (que es el caso del número 1), la acción predeterminada es imprimir el registro actual.
Glenn Jackman