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

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    

Что я должен делать?

решение1

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

gsub(cuv1,cuv2);

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

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

awk -i inplace  -v 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"

Связанный контент