sed 's/123/AAA/p' a.txt
Esta expressão contém dois comandos
-
s/123/AAA/
significa, localize linhas com123
e substitua123
porAAA
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 chamamosp
, 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.