sed acrescenta após uma linha contendo múltiplas strings não ordenadas

sed acrescenta após uma linha contendo múltiplas strings não ordenadas

Estou tentando usar o sed para anexar appendstringapós uma linha que contém Helloe World.

Hello something here World
World fsf Hello

Isso funciona se eu considerar a ordem:

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

Mas se eu tiver muitas strings para combinar e elas não estiverem em ordem, isso definitivamente não será eficaz.

Então tentei soluções de outro link que discutia a exclusão de uma linha que contém as duas strings sem considerar sua ordem.

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

No entanto,

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

Isso nem funciona para exclusão.

A seguinte, também uma das respostas a essa pergunta:

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

funciona,então tentei implementá-lo para anexar. Usando:

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

Mas recebeu erro:

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

Atualizar: A postagem no link indicava a solução com !b, e não estava funcionando em cshell por causa do ponto de exclamação, mas está funcionando em sh e bash. E também pode ser facilmente estendido para inserir muitas linhas ao executar sed dentro de um script e anexar um parágrafo grande.

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

Responder1

Você quase se cansou de:

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

Você precisa separar seus argumentos. Use -e, assim:

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

Observe que usando oaO comando ppend sem nova linha é uma extensão GNU, assim como a -iopção.


Para fazer isso de forma mais portável, e considerando também a possibilidade de correspondência de múltiplas strings, tente:

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

Como você já está usando o GNU Sed, basta usar:

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

informação relacionada