print
в этом первом скрипте является ошибкой.
Второй аргумент gsub
- это строка замены, а не команда.
Вы хотите только FILENAME
. (Примечание не "FILENAME"
это буквальная строка. FILENAME
переменная.)
find . -type f -print0 | while IFS= read -d '' file
do
awk '{gsub(/CASE/,FILENAME,$0)} 7' "$file" >"$file.$$"
mv "$file.$$" "$file"
done
Обратите внимание, что я цитировал все переменные и фиксированные ваш find | read
трубопровод правильно работает для файлов с нечетными символов в названиях (см Bash FAQ 001 для более об этом). Я также исправил ошибочный >
в команде mv
.
См. Ответы на вопрос this question о том, как правильно удалить исходное имя файла, чтобы сделать его безопасным для использования в заменяемой части gsub
.
Также обратите внимание, что последние версии (4.1+, я считаю) awk имеют аргумент -i inplace
.
Чтобы исправить второй скрипт, вам нужно добавить кавычки, которые вы удалили из первого скрипта.
for i in *; do awk '{gsub(/CASE/,"'"${i}"'",$0)}' "${i}" > file.txt; done
Обратите внимание, что я избавилась от более чем бесполезно использования ls
(хуже, чем бесполезно, потому что он активно ломает файлы с пробелами или метасимволами в их названиях (см Parsing ls подробнее об этом).
Эта команда, хотя это несколько некрасиво и небезопасно для имен файлов с различными персонажами в них и было бы лучше записать в виде хотя:.
for i in *; do awk -v fname="$i" '{gsub(/CASE/,fname,$0)}' "${i}" > file.txt; done
так, что будет работать с именами файлов с двойными кавычками/и т.д. I n их имена правильно, тогда как версия с прямым изменением переменных не будет.
При этом исправленный первый скрипт является правильным ответом.
Никогда не делайте 'для i в $ (ls *)', поскольку это ничего не добавляет по сравнению с 'for i in *' и вводит возможные ошибки, такие как файлы с пробелами в их именах. Кроме того, awk не является оболочкой - вы не можете получить доступ к переменной оболочки внутри awk-скрипта, так же как вы не можете получить доступ к переменной оболочки внутри программы C. См. Http://cfajohnson.com/shell/cus-faq-2.html#Q24 о том, как передать VALUE переменной оболочки в awk-скрипт. –