Por que o comando de substituição de sed com o sinalizador p imprime a saída modificada duas vezes?

2

Meu a.txt contém o seguinte:

apple
123
pear
1234

Se eu executar este comando abaixo,

sed 's/123/AAA/p' a.txt

Eu achei que receberia

apple
123
AAA
pear
1234
AAA4

porque o sed imprime automaticamente cada linha por padrão. E eu estava esperando minha saída modificada após o que foi modificado no espaço padrão. Mas minha saída real imprime a substituição duas vezes:

apple
AAA
AAA
pear
AAA4
AAA4

Por que isso?

    
por Mint.K 01.02.2017 / 01:19

1 resposta

6
sed 's/123/AAA/p' a.txt

Esta expressão contém dois comandos

  • s/123/AAA/ significa, localize linhas com 123 e substitua 123 por AAA em sua primeira instância nas linhas em que ocorre. Por padrão, sed imprime todas as linhas, portanto, todo o fluxo é impresso com as modificações

  • p significa, imprima o espaço do padrão. No ponto em que chamamos p , o espaço de padrão contém as linhas modificadas, para que elas sejam impressas novamente.

A combinação de s e p é normalmente usada com -n , quando só queremos imprimir as linhas do fluxo que foram encontradas por s e, portanto, alteradas.

A ordem dos comandos é importante. Em seu comando, se você colocar p primeiro, ele imprimirá o fluxo não modificado, próximo do que você esperava:

$ sed 'ps/123/AAA/' a.txt
apple
apple
123
AAA
pear
pear
1234
AAA4

Aqui, quando chamamos p , o espaço padrão é o arquivo inteiro, porque não especificamos nenhuma parte dele e não foi alterado. O comando s também imprime o arquivo inteiro, mas também o modifica, então vemos o fluxo duas vezes, modificado e não modificado.

Portanto, talvez seja útil pensar que os comandos em uma expressão sed são aplicados cumulativamente da esquerda para a direita e, como disse a Steeldriver, a saída que você obtém nesse caso deve-se ao p ser aplicado no final de o ciclo, após s ter sido usado para selecionar e modificar parte do arquivo.

    
por Zanna 01.02.2017 / 06:03