У меня есть файл 1.txt

INTEGER-d_int ()
INTEGER-d_int  ()
INTEGER-d_int       (    )
INTEGER-d_intClass()
INTEGER-d_intClass     new()

и я хочу заменить вхождение d_int на d_INT в строках 1 и 5.

В моем случае эти номера строк находятся в переменной.

2 ответа2

2

Установите переменные 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
-1
sed -i '1,5s/d_int/d_INT/' 1.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .