У меня есть большое количество файлов, содержащих текст. Все файлы содержат слово «заменить» (без кавычек). Я хотел бы заменить это слово названием файла.
Пример, имя файла: On Time.txt
Замените слово «заменить» (без кавычек) на «On Time» (без кавычек).
Это просто в ZSH:
$ for f in *.txt; do filename=`echo ${f:r}`; sed -i -e "s/replace/$filename/" $f; done
Использование макропроцессора m4
:
tmpfile=$(mktemp)
for name in *.txt; do
cp -- "$name" "$tmpfile"
m4 -P -D replace="${name%.txt}" <"$tmpfile" >"$name"
done
rm -f "$tmpfile"
Это использует m4
путем создания макроса с именем replace
со значением, которое является именем файла с удаленным суффиксом имени файла .txt
. Каждый раз, когда макрос replace
встречается в файле, он будет заменен его значением.
Учтите, что это может привести к неожиданным результатам, если вы используете какие-либо m4
другие макросы в файлах. С -P
макропроцессор m4
будет распознавать свои встроенные макросы только в том случае, если перед ними стоит строка m4_
, например. m4_dnl
, поэтому случайные столкновения не должны происходить часто.