У вас есть три отдельных подзадачи:
- замена текста в файле
- справка со спецсимволами
- выбор файлов для применения преобразования к
1. Инструмент для замены канонического текста: sed
:
sed -e 's/PATTERN/REPLACEMENT/g' <INPUT_FILE >OUTPUT_FILE
Если у вас есть GNU sed (например, в Linux или Cygwin), передайте -i
, чтобы преобразовать файл на месте. Вы можете использовать несколько файлов в одной командной строке.
sed -i -e 's/PATTERN/REPLACEMENT/g' FILE OTHER_FILE…
Если у вашего sed нет опции -i
, вам нужно записать в другой файл и впоследствии переместить его на место. (Это то, что GNU sed делает за кулисами.)
sed -e 's/PATTERN/REPLACEMENT/g' <FILE >FILE.tmp
mv FILE.tmp FILE
2. Если вы хотите заменить буквенную строку литеральной строкой, вам необходимо поставить перед всеми специальными символами обратную косую черту. Для шаблонов sed специальные символы .\[^$*
плюс разделитель для команды s
(обычно /
). Для замены текста в тексте используются специальные символы \&
и символы новой строки. Вы можете использовать sed
, чтобы превратить строку в подходящий шаблон или текст для замены.
pattern=$(printf %s "$string_to_replace" | sed -e 's![.\[^$*/]!\\&!g')
replacement=$(printf %s "$replacement_string" | sed -e 's![\&]!\\&!g')
3. Чтобы воздействовать на несколько файлов непосредственно в одной или нескольких директориях, используйте подстановочные знаки оболочки. Ваши требования не кажутся полностью совместимыми; Я думаю, что это шаблоны, которые вы ищете, но обязательно просмотрите их.
/www/mysite/board/today/[rsh][0-9][0-9][0-9]/index.html
/www/mysite/person/[0-9]/[0-9]/[0-9]/card/2011/[rsh][0-9].html
Это будет соответствовать файлам типа /www/mysite/board/today/r012/index.html
и /www/mysite/person/4/5/6/card/2011/h7.html
, но не /www/mysite/board/today/subdir/s012/index.html
или /www/mysite/board/today/r1234/index.html
.
Если вам нужно рекурсивно воздействовать на файлы в подкаталогах, используйте find
. Это не соответствует вашим требованиям, и этот ответ уже достаточно длинный, поэтому я остановлюсь здесь.
4. Собираем все вместе:
string_to_replace='(div id="id")[code](/div)<--#include="(path)"-->(div id="id")[more code](/div)'
replacement_string='(div id="id")<--include="(path)"-->(/div)'
pattern=$(printf %s "$string_to_replace" | sed -e 's![.\[^$*/]!\\&!g')
replacement=$(printf %s "$replacement_string" | sed -e 's![\&]!\\&!g')
sed -i -e "s/$pattern/$replacement/g" \
/www/mysite/board/today/[rsh][0-9][0-9][0-9]/index.html \
/www/mysite/person/[0-9]/[0-9]/[0-9]/card/2011/[rsh][0-9].html
Последнее замечание: вы, кажется, работаете над HTML с помощью регулярных выражений. Это часто не очень хорошая идея .