Usando o GNU sed
Para substituir as linhas que iniciam uma linha que corresponde a 3
e continuar para uma linha que corresponde a 5
com New Code
:
$ seq 8 | sed '/3/,/5/{/5/ s/.*/New Code/; t; d}'
1
2
New Code
6
7
8
Para linhas no intervalo /3/,/5/
, testamos se a linha corresponde a 5
(o que significa que esta é a última linha do grupo) e, em caso afirmativo, fazemos a substituição para inserir New Code
. Se a substituição foi feita, o comando t
informará ao sed para ir até o final dos comandos (nesse caso, New Code
é impresso). Caso contrário, o comando d
informará ao sed para excluir a linha.
Todas as outras linhas são impressas normalmente.
Para alterar o arquivo, a opção -i
pode ser usada:
sed -i.bak '/3/,/5/{/5/ s/.*/New Code/; t; d}' file
Usando o awk
Para fazer o mesmo usando o awk:
$ seq 8 | awk '/3/,/5/{if (!f)print "New Code"; f=1; next}; 1'
1
2
New Code
6
7
8
O comando awk trata as linhas no intervalo /3/,/5/
especialmente. Para linhas nesse intervalo, testamos se f
é zero (ou seja, se !f
for true) e, em caso afirmativo, imprimimos New Code
e definimos f
para 1 e, em seguida, ignoramos o restante dos comandos e pule para a linha next
.
Para linhas fora do intervalo /3/,/5/
, nenhum salto é feito e o 1
faz com que a linha seja impressa. Mais detalhadamente, 1
é uma condição. Como 1
não é zero, a condição é avaliada como verdadeira. Como nenhuma ação está associada à condição, é executada a ação padrão que é imprimir a linha. Assim, 1
é uma abreviação para impressão na linha.
Para alterar um arquivo, a opção -i inplace
pode ser usada com o GNU awk
4.1 ou superior:
awk -i inplace '/3/,/5/{if (!f)print "New Code"; f=1; next} 1' file