Consegui obter grep
do meu pipeline para sed
usando !d
sed -e'/\.foo$/!d' -e's/file/blag/' ./input
Responda por este post no fórum
Eu tenho um arquivo como:
file.foo
file2.foo
file.bar
file3.foo
Agora quero retornar apenas as linhas que terminam com .foo
, mas desejo renomear todas as ocorrências de file
com blag
. Nesse caso, isso significa ignorar file.bar
inteiramente. Como faço para fazer isso com apenas sed ? Essencialmente, o que estou fazendo atualmente é:
grep '\.foo$' input | sed -e's/file/blag/'
Mas eu gostaria de cortar o grep.
Esta questão é baseada em um pipeline que fiz para essa resposta
Consegui obter grep
do meu pipeline para sed
usando !d
sed -e'/\.foo$/!d' -e's/file/blag/' ./input
Responda por este post no fórum
Ou, na forma de espelho, desative a impressão padrão, faça as substituições e, em seguida, apenas as linhas de impressão desejadas:
sed -n 's/file/blag/; /\.foo$/p' < input
Ou filtre as linhas desejadas primeiro e, em seguida, substitua e imprima:
sed -n '/\.foo$/ { s/file/blag/; p }' < input
Selecione as linhas que terminam em .foo
e execute uma substituição apenas para essas linhas:
sed '/\.foo$/{s/file/blag/}'
Teste:
$ echo $'file.foo\nfile2.foo\nfile.bar\nfile3.foo' | sed '/\.foo$/{s/file/blag/}'
blag.foo
blag2.foo
file.bar
blag3.foo
sed -n 's/\(file\)\(.*\)\(\.foo\)/blang/p' input.txt > output.txt
(grava no arquivo de saída)
OR
sed -i 's/\(file\)\(.*\)\(\.foo\)/blang/' input.txt
(substituição de arquivos)