O editor de arquivos especificado por POSIX, ex
, é capaz de fazer exatamente isso .
printf '%s\n' '/1//4/s//8/' x | ex file.txt
ex
é capaz de combinar vários endereços. Portanto, /1/
significa "Ir para" (ou referir-se a) "a próxima linha que corresponde a regex 1
." Então, /4/
vai dessa linha para a próxima linha que corresponde a 4
. E s//8/
tem o significado usual; como em Sed, um regex em branco passado para o comando s
significa "reutilizar o último regex usado", que neste caso é 4
.
Para imprimir o arquivo modificado, mas não salvar as alterações, use o seguinte comando:
printf '%s\n' '/1//4/s//8/' %p | ex file.txt
Só para melhorar a idéia de vários endereços, o comando a seguir exclui a primeira linha contendo cherry
antes da primeira linha contendo banana
após linha 27:
printf '%s\n' '27/banana/?cherry?d' x | ex file.txt
x
significa salvar as alterações e sair, e %p
significa "imprimir arquivo inteiro". ( %
é um sinônimo para 1,$
, que é um intervalo de endereços da primeira linha até a última linha.)