Factoring um grep de um grep | fluxo sed ou escrevendo grep em sed?

1

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

    
por Evan Carroll 07.07.2018 / 19:14

4 respostas

1

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

    
por 07.07.2018 / 19:14
3

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
    
por 07.07.2018 / 20:22
0

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
    
por 08.07.2018 / 01:29
0
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)

    
por 09.07.2018 / 12:45

Tags