sed agregar después de una línea que contiene múltiples cadenas desordenadas

sed agregar después de una línea que contiene múltiples cadenas desordenadas

Estoy intentando usar sed para agregar appendstringdespués de una línea que contiene tanto Hellocomo World.

Hello something here World
World fsf Hello

Esto funciona si considero el orden:

sed -i '/Hello*World\|World*Hello/a appendstring' file

Pero si tengo muchas cadenas que hacer coincidir y no están en orden, esto definitivamente no es efectivo.

Luego probé soluciones de otro enlace que trataba sobre cómo eliminar una línea que contiene ambas cadenas sin considerar su orden.

https://stackoverflow.com/questions/28561519/delete-lines-that-contain-two-strings

Sin embargo,

sed -i '/Hello/!b;/World/d' file

Esto ni siquiera funciona para eliminarlo.

La siguiente, también una de las respuestas a esa pregunta:

sed -i '/Hello/{/World/d}' file

obras,así que intenté implementarlo para agregarlo. Usando:

sed -i '/Hello/{/World/a} appendstring' file

Pero recibió un error:

sed: -e expression #1, char 0: unmatched `{'

Actualizar: La publicación en el enlace indicaba la solución con !b, y no funcionaba en cshell debido al signo de exclamación, pero funciona en sh y bash. Y también se puede ampliar fácilmente para insertar muchas líneas cuando se ejecuta sed dentro de un script y agregar un párrafo grande.

sed -i '/Hello/!b; /World/a \
addline \
addanotherline ' file

Respuesta1

Casi lo tienes con:

sed -i '/Hello/{/World/a} appendstring' file

Necesitas separar tus argumentos. Utilice -e, así:

sed -i -e '/Hello/{/World/a appendstring' -e '}' file

Tenga en cuenta que utilizar elaEl comando ppend sin una nueva línea es una extensión GNU, al igual que el -imodificador.


Para hacer esto de forma más portátil, y considerando también la posibilidad de que coincidan varias cadenas, intente:

sed '/multiple/{/words/{/to/{/match/ s/$/append this/;};};}' file > newfile
mv newfile file

Como ya estás usando GNU Sed, solo usa:

sed -i -e '/multiple/{/words/{/to/{/match/ a append this' -e 'a and also this' -e 'a oh and this too' -e '};};}' file

información relacionada