Exemplo de tarefa: se uma linha contiver foo
, substitua-a por bar
, caso contrário, anexe baz
à linha.
sed -e s/foo/bar/ -e s/$/baz/
não funciona, pois o segundo comando é executado independentemente do primeiro corresponder ou não. Existe uma maneira de dizer sed
para ir para a próxima linha após uma partida?
Você pode usar o
t
comando sem um rótulo para iniciar o próximo ciclo na substituição bem-sucedidaDo manual:
Uma maneira mais robusta com
awk
script:Ou ainda mais curto:
Tente isto:
Descobriu:
Explicação:
;
e agrupados com{
...}
./foo/
seleciona todas as linhas que contêm o padrãofoo
.s//bar/
é o mesmo ques/foo/bar/
- um padrão vazio significa repetir a última pesquisa (neste caso,foo
).p
significa imprimir o espaço do padrão (a linha após a substituição).D
significa limpar a linha atual e ir para a próxima.s/$/baz/
irá executar a segunda parte da tarefa, ou seja, anexarbaz
às linhas que a regra anterior deixou para passar.