Найти и заменить на имя файла

У меня есть большое количество файлов, содержащих текст. Все файлы содержат слово «заменить» (без кавычек). Я хотел бы заменить это слово названием файла.

Пример, имя файла: On Time.txt

Замените слово «заменить» (без кавычек) на «On Time» (без кавычек).

0
16.12.2018, 05:46
2 ответа

Это просто в ZSH:

$ for f in *.txt; do filename=`echo ${f:r}`; sed -i -e "s/replace/$filename/" $f; done
0
28.12.2020, 22:31

Использование макропроцессора 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, поэтому случайные столкновения не должны происходить часто.

0
28.12.2020, 22:46

Теги

Похожие вопросы