Você deve adicionar uma segunda condição - exclua somente se não a última linha e na última linha use a
ppend em vez de substituir a linha depois, se corresponder a, por exemplo.
sed -E '/foo|bar/{$!d
}
${a\
foo\
bar
//d
}' infile
Os arquivos ficam confusos com várias linhas contendo foo
ou bar
. Quero remover todos eles e anexar uma linha de cada no final.
Então, dado um arquivo
some stuff
foo1
foo2
bar=42
some other stuff
bar
foo
more stuff
o script sed deve retornar
some stuff
some other stuff
more stuff
foo
bar
Eu tentei com o sed '/foo/d;/bar/d;$s/$/\nfoo\nbar/'
, que funciona contanto que a última linha não contenha foo
nem bar
e o arquivo não esteja vazio.
Como fazer isso funcionar mesmo com foo
na última linha? Eu gostaria de ficar com o sed, porque todo o script deveria fazer mais do que apenas isso. De fonte eu poderia acrescentar minhas linhas com eco após o script, mas eu me pergunto se não existe uma solução tudo-em-um.
Editar: o caso de arquivo vazio não precisa ser tratado.
( sed -e '/foo/d' -e '/bar/d' data.in; cat <<END
foo
bar
END
) >data.out
Excluindo as linhas indesejadas com sed
, basta adicionar as linhas finais desejadas com cat
e gerar um novo arquivo.
Como alternativa, use printf
em vez de cat
:
( sed -e '/foo/d' -e '/bar/d' data.in; printf 'foo\nbar\n' ) >data.out
Ou, em dois passos,
sed -e '/foo/d' -e '/bar/d' data.in >data.out
printf 'foo\nbar\n' >>data.out
Isso tem a vantagem de ser claro e de fácil manutenção.
Tags text-processing sed