sed anex após uma linha contendo várias strings não ordenadas

3

Estou tentando usar o sed para anexar appendstring após uma linha que contenha Hello e 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 sequências para correspondência e elas não estiverem em ordem, isso definitivamente não é efetivo.

Então, tentei soluções de outro link que discutia a exclusão de uma linha que continha as duas sequências sem considerar o pedido delas.

link

No entanto,

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

Isso nem funciona para exclusão.

O seguinte, também uma das respostas para essa pergunta:

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

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

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

Mas recebeu um erro:

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

Atualização: O post no link declarou a solução com! B, e não estava funcionando em cshell por causa da marca de exlamation, mas está trabalhando 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
    
por phonycollectibles 02.11.2016 / 06:59

1 resposta

2

Você quase teve isso com:

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

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

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

Note que usar o comando a ppend sem uma nova linha é uma extensão GNU, assim como a opção -i .

Para fazer isso de forma mais portável e considerando também a possibilidade de várias strings corresponderem, tente:

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

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

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

Tags