pt script para remover todas as linhas com um padrão e acrescentar linhas no final

3

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.

    
por Philippos 15.03.2017 / 15:52

2 respostas

0

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
    
por 15.03.2017 / 16:08
0
( 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.

    
por 15.03.2017 / 16:25