awk, awk с переменными, файл

Я пытаюсь изменить некоторые файлы следующим образом:

  • Замена данного слова на другое с помощью оператора awk.
  • Оба слова должны быть переменными в awk.

Я пробовал что-то вроде этого, но мой код работает неправильно.

read word read replace while read file do if [[ -f $file ]] then awk -v cuv1="$word" -v cuv2="$replace" '{gsub(/cuv1/,"cuv2")}' "$file" else echo "File does not exist" fi done 

Что мне делать?

Основная ошибка заключается в том, что gsub(/cuv1/, "cuv2") не будет искать переменные, он будет искать строку cuv1 и заменить ее cuv2 . Чтобы использовать переменные, вы хотите:

 gsub(cuv1,cuv2); 

Следующая проблема заключается в том, что вы на самом деле не говорите awk о печати что-либо. Действие awk умолчанию, когда выражение принимает значение true, это печать строки, поэтому ваша команда (с исправлением выше) будет печатать любые строки, в которых работала замена, но не какие-либо другие.

Наконец, вы, похоже, ожидаете, что awk внесет изменения в исходный файл. Для этого вам понадобится расширение GNU awk (gawk) -i inplace . Это, однако, относительно новое и не переносное. Он не будет работать на всех системах. Объединяя все это вместе, мы получаем (предполагая GNU awk):

 awk -i inplace cuv1="$word" -v cuv2="$replace" '{gsub(cuv1,cuv2); print;}' "$file" 

Более простые решения с использованием sed и perl :

 sed -i "s/$word/$replace/g" "$file" perl -i -pe "s/$word/$replace/g" "$file"