Como você está aprendendo sed
, aproveito o tempo para adicionar à resposta do @ John1024:
1) Por favor, note que você está usando \n
na string de substituição. Isso funciona no GNU sed
, mas não faz parte do POSIX, portanto, ele inserirá uma barra invertida e um n
em muitos outros sed
s (usando \n
no padrão é portátil, btw).
Em vez disso, sugiro fazer s/Network\([[:space:]]\)Administrator/SystemUser/g
: O [[:space:]]
corresponderá a nova linha ou espaço em branco, para que você não precise de dois comandos s
, mas combine-os em um. Envolvendo-o com \(...\)
você pode se referir a ele na substituição: O será substituído pelo que quer que tenha sido correspondido no primeiro par de
\(\)
.
2) Para corresponder corretamente os padrões em duas linhas, você deve saber o padrão N;P;D
:
sed '$!N;s/Network\([[:space:]]\)Administrator/SystemUser/g;P;D'
O N
está sempre anexando a próxima linha (exceto a última linha, é por isso que ela é "endereçada" com $!
(= se não a última linha; você deve sempre considerar preceder N
com $!
para evitar terminar o script acidentalmente. Depois, após a substituição, o P
imprime somente a primeira linha no espaço padrão e a D
exclui essa linha e inicia o próximo ciclo com os restos do espaço padrão (sem ler a próxima Esta é provavelmente a que você originalmente pretendia.
Lembre-se desse padrão, você geralmente precisará dele.
3) Outro padrão útil para edição de múltiplas linhas, especialmente quando mais de duas linhas estão envolvidas: Mantenha a coleta de espaço, como sugeri a John:
sed 'H;1h;$!d;g;s/Network\([[:space:]]\)Administrator/SystemUser/g'
Repito para explicar: H
acrescenta cada linha ao espaço de espera. Como isso resultaria em uma nova linha extra antes da primeira linha, a primeira linha precisa ser movida em vez de anexada com 1h
. O seguinte $!d
significa "para todas as linhas, exceto a última, exclua o espaço do padrão e comece novamente". Assim, o resto do script é executado apenas para a última linha. Neste ponto, todo o arquivo é coletado no espaço de espera (portanto, não use isso para arquivos muito grandes!) E o g
o move para o espaço de padrão, para que você possa fazer todas as substituições de uma vez como pode com a opção -z
do GNU sed
.
Este é outro padrão útil que sugiro ter em mente.