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
nnão deveria ser editada pelos comandos que precedemn1 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.