Bem, vamos ver ...
o comando b
ranch:
[2addr]b[label]
Branch to :label. If label is not specified, branch to the end of the script.
o comando n
ext:
[2addr]n
If auto-print is not disabled, print the pattern space, then, regardless,
replace the pattern space with the next line of input. If no next line of
input is available, branch to the end of the script.
Então a principal diferença aqui é:
b
ramifica-se incondicionalmente no final do script
n
apenas ramifica para o final do script se não houver mais entrada
Assumindo uma entrada como:
fdue
four
four
fdue
four
e que eu queria substituir f
por t
, mas apenas em linhas que correspondem a four
e em todas as outras linhas, substitua u
por i
. Uma maneira de fazer isso é
sed '/four/{s/f/t/;b;};s/u/i/' infile
e a saída é, como esperado
fdie
tour
tour
fdie
tour
agora, vamos ver o que acontece quando usamos n
em vez de b
:
fdie
tour
foir
fdie
tour
A segunda linha correspondente a four
foi editada para foir
em vez de tour
pelo simples motivo n
não retornar ao topo do script. Em vez disso, o comando s
após o n
processou a linha, mesmo que isso não fosse intencional. No entanto, na última linha, somente a primeira substituição foi feita, então o comando s
depois que o n
não foi mais executado.
Para resumir, esses dois comandos podem ser funcionalmente equivalentes se:
- o script estava processando a última linha de entrada ( antes executando
n
) ou - a próxima linha puxada por
n
não deveria ser editada pelos comandos que precedemn
1 de qualquer maneira (em outras palavras, a próxima linha não era um endereço associado ab
)
É verdade que n
imprime o espaço padrão atual e puxa a próxima linha, mas b
sozinho também tem o mesmo efeito: ramificar para o final do script significa impressão automática (a menos que sed
tenha sido invocado com -n
, caso em que n
também não imprime) e depois lendo automaticamente na próxima linha de entrada. A principal diferença, como eu disse, é que n
não pula para o final do script (e ele também não retorna ao topo do script): sed
simplesmente executa os comandos restantes - se houver ( e se não estiver na última linha ).
1
Esses comandos não serão executados, pois, como eu disse, n
não retorna ao topo do script; Além disso, os demais comandos podem editar a linha que é algo que não deveria acontecer.