grep um arquivo e canaliza a saída para sed e armazena a saída sed em um arquivo

3

Conteúdo de source.txt :

gold  green white black blue
yellow magenta brown 
tram kilo charlie tango

Olá a todos! Eu preciso resolver um mistério.

Estou tentando executar um script pequeno para executar um arquivo source.txt , enviar grep output para sed substituir uma string e armazenar essa linha em um novo arquivo pol.txt

grep -l "gold" source.txt | xargs sed  's/green/red/' >  pol.txt

Em vez de ter apenas a linha armazenada em pol.txt :

gold  red white black blue

Eu tenho o arquivo inteiro em si com a string que eu substituí

gold  red white black blue
yellow magenta brown 
tram kilo charlie tango

Quando eu removo a opção -l do comando grep eu tenho isso e, claro, nada em pol.txt

sed: can't read gold: No such file or directory
sed: can't read green: No such file or directory
sed: can't read white: No such file or directory
sed: can't read black: No such file or directory
sed: can't read blue: No such file or directory

grep é necessário como testador e, infelizmente, "se" não é uma opção.

    
por Driven 20.07.2016 / 23:15

2 respostas

4

Para selecionar qualquer linha que contenha gold do source.txt e substitua a primeira ocorrência de green por red :

$ sed  -n '/gold/{s/green/red/; p}' source.txt 
gold  red white black blue

Para salvar isso em um arquivo:

sed  -n '/gold/{s/green/red/; p}' source.txt  >pol.txt

Como funciona

  • -n diz ao sed para não imprimir as linhas, a menos que seja explicitamente solicitado.

  • /gold/ seleciona linhas que correspondem à regex gold .

  • s/green/red/ executa a substituição

  • p imprime.

Usando o awk

Com a mesma lógica:

$ awk '/gold/{gsub(/green/, "red"); print}' source.txt 
gold  red white black blue

Usando o grep

Se formos forçados, por motivos ainda não explicados, a usar um pipeline do grep, tente:

$ grep -l --null "gold" source.txt | xargs -0 sed  -n '/gold/s/green/red/p'
gold  red white black blue
    
por 20.07.2016 / 23:22
1

grep -l "gold" source.txt produzirá source.txt se o arquivo contiver a palavra ouro xargs sed 's/green/red/' será executado em sed 's/green/red/' source.txt e o redirecionamento final salvará o resultado na sua saída.

Se eu entendi sua intenção corretamente, você quer o seguinte comando:

sed -n '/gold/s/green/red/p' source.txt > pol.txt

O /gold/ seleciona as linhas que correspondem a gold e o comando s faz a substituição desejada.

    
por 20.07.2016 / 23:22