¿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

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

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.


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

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

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'


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.


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