
Я пытаюсь изменить некоторые файлы следующим образом:
- Замена заданного слова другим с помощью оператора 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"