Установите переменные a и b для строк, на которых вы хотите выполнить подстановку, а затем запустите awk:
a=1; b=5; awk '{ if (NR=='"$a"' || NR=='"$b"') sub("d_int","d_INT",$0); print $0}' 1.txt
Выше awk проверяет, находимся ли мы в строке с номером $a
или в строке с номером $b
. Если это так, он выполняет замену.
Часть хитрости использования awk
заключается в защите команд awk
от оболочки. Для этого команды awk
везде заключаются в одинарные кавычки, кроме случаев, когда мы явно хотим, чтобы оболочка заменила $a
и $b
. $a
и $b
каждый в двойных кавычках.
На вашем примере 1.txt
вышеприведенное выдает:
INTEGER-d_INT ()
INTEGER-d_int ()
INTEGER-d_int ( )
INTEGER-d_intClass()
INTEGER-d_INTClass new()
Альтернативный подход
sed
также может быть использован для этого. Команда sed для изменения только строки 1 - 1 s/d_int/d_INT/
а команда sed
для изменения только строки 5 - 5 s/d_int/d_INT/
. Таким образом, используя подстановку оболочки, программа sed
для выполнения подстановок в строках a
и b
выглядит так:
a=1; b=5; s='s/d_int/d_INT/' ; sed "$a $s; $b $s" 1.txt
Расширение до произвольного числа строк
Предположим, что нам предоставлен произвольный список lines
к которым применяется подстановка:
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