Основная ошибка заключается в том, что 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"
Нет, в последней версии Linux эта функция удалена.
Шучу, конечно, можно.
for dir in dir1 dir2 dir3; do
zip -r "$dir" "$dir"
done
Если каталоги действительно имеют одинаковый префикс:
for dir in dir[1-3]; do
zip -r "$dir" "$dir"
done
Это предполагает, что цикл выполняется в правильном каталоге.
Если у вас много каталогов и вы хотите исключить только некоторые из них, используйте bash
с набором параметров оболочки extglob
:
shopt -s extglob
for dir in dir!(4|5); do
test -d "$dir" || continue
zip -r "$dir" "$dir"
done
Шаблон dir!(4|5)
будет соответствовать любому имени, начинающемуся с dir
и продолжающемуся чем угодно, кроме 4
или 5
. Шаблон также мог быть написан dir!([4-5])
или !(dir4|dir5)
.
Я также убедился, что в последнем цикле любое совпадающее имя, не являющееся именем каталога, пропускается.