Как преобразовать соответствие шаблону Regex в нижний регистр для стандартизации / очистки URL - PullRequest
3 голосов
/ 13 октября 2011

В настоящее время я пытаюсь преобразовать все ссылки, файлы и теги на моем сайте из UPPERCASE.ext и CamelCase.ext в lowercase.ext.

Я могу сопоставить ссылки на страницах, используя регулярное выражение для href="[^"]*" и src="[^"]*" Похоже, это хорошо работает для идентификации ссылки и изображений в HTML.

Однако, что мне нужно сделать, это взять совпадение и запустить функцию ToLowercase() для совпадений. Поскольку у меня есть много страниц, которые я хотел бы проанализировать, я хочу создать короткий сценарий оболочки, который будет запускаться в указанном каталоге, а шаблон соответствует заданным регулярным выражениям и будет выполнять над ними строчные операции.

Ответы [ 4 ]

2 голосов
/ 13 октября 2011

Однострочный Perl для переименования всех обычных файлов в нижний регистр:

perl -le 'use File::Find; find({wanted=>sub{-f && rename($_, lc)}}, "/path/to/files");'

Если вы хотите более точно определить, какие файлы переименованы, вы можете изменить -f на регулярное выражение или что-то в этом роде:

perl -le 'use File::Find; find({wanted=>sub{/\.(txt|htm|blah)$/i && rename($_, lc)}}, "/path/to/files");'

РЕДАКТИРОВАТЬ: Извините, после перечитывания вопроса, я вижу, вы также хотите заменить вхождения в файлах:

find /path/to/files -name "*.html" -exec perl -pi -e 's/\b(src|href)="(.+)"/$1="\L$2"/gi;' {} \;

РЕДАКТИРОВАТЬ 2: Попробуйте это, поскольку команда find использует + вместо \;, что более эффективно, поскольку несколько файлов передаются в perl одновременно (благодаря @ikegami из другого поста). Он также обрабатывает ' и " вокруг URL. Наконец, он использует {} вместо // для подстановок, поскольку вы подставляете URL (возможно, / в URL вводят в заблуждение perl или вашу оболочку?) Это не должно иметь значения, и я попробовал оба в моей системе с одинаковым эффектом (оба работали нормально), но это стоит попробовать:

find . -name "*.html" -exec perl -pi -e \
    '$q=qr/"|\x39/; s{\b(src|href)=($q?.+$q?)\b}{$1=\L$2}gi;' {} +

PS: У меня также есть Macbook, и я протестировал его, используя оболочку bash с Perl версий 5.8.9 и 5.10.0.

1 голос
/ 13 октября 2011

С помощью bash вы можете объявить переменную, содержащую только строчные значения:

declare -l varname
read varname <<< "This Is LOWERCASE"
echo $varname  # ==> this is lowercase

Или вы можете преобразовать значение в нижний регистр (я думаю, bash версии 4)

x="This Is LOWERCASE"
echo ${x,,}  # ==> this is lowercase
1 голос
/ 13 октября 2011

ты хочешь этого?

kent$  echo "aBcDEF"|sed 's/.*/\L&/g'
abcdef

или это

kent$  echo "aBcDEF"|awk '$0=tolower($0)'
abcdef

с вашим собственным регулярным выражением:

kent$  echo 'FOO src="htTP://wWw.GOOGLE.CoM" BAR BlahBlah'|sed -r 's/src="[^"]*"/\L&/g'   
FOO src="http://www.google.com" BAR BlahBlah
0 голосов
/ 13 октября 2011

Вы можете использовать sed с -i (редактирование на месте):

sed -i'' -re's/(href|src)="[^"]*"/\L&/g' /path/to/files/*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...