
Estou tentando usar o sed para anexar appendstring
após uma linha que contém 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 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 -i
opçã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