Defina as variáveis aeb nas linhas nas quais deseja fazer a substituição e execute awk:
a=1; b=5; awk '{ if (NR=='"$a"' || NR=='"$b"') sub("d_int","d_INT",$0); print $0}' 1.txt
Acima, o awk verifica se estamos no número de linha $a
ou no número de linha $b
. Se assim for, realiza a substituição.
Parte do truque de usar awk
é proteger os comandos awk
do shell. Para fazer isso, os comandos awk
estão em aspas simples em todos os lugares, exceto onde explicitamente queremos que o shell substitua $a
e $b
. $a
e $b
estão cada entre aspas duplas.
No seu exemplo 1.txt
, o acima produz:
INTEGER-d_INT ()
INTEGER-d_int ()
INTEGER-d_int ( )
INTEGER-d_intClass()
INTEGER-d_INTClass new()
Abordagem Alternativa
sed
também pode ser usado para isso. O comando sed para alterar apenas a linha 1 é 1 s/d_int/d_INT/
e o comando sed
para alterar apenas a linha 5 é 5 s/d_int/d_INT/
. Assim, usando a substituição de shell, um programa sed
para fazer as substituições nas linhas a
e b
é:
a=1; b=5; s='s/d_int/d_INT/' ; sed "$a $s; $b $s" 1.txt
Extensão para um número arbitrário de linhas
Suponha que recebamos uma lista arbitrária de lines
para aplicar a substituição:
lines="1 5 6 9 15 19 20"
s='s/d_int/d_INT/'
for line in $lines
do
echo line=$line
cmd="$line $s; $cmd"
done
echo cmd=$cmd
sed "$cmd" 1.txt