
Estoy intentando usar sed para agregar appendstring
después de una línea que contiene tanto Hello
como 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 -i
modificador.
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