#html #regex #bash #url #awk
#HTML #регулярное выражение #bash #url #awk
Вопрос:
В настоящее время я пытаюсь преобразовать все ссылки, файлы и теги на моем сайте из UPPERCASE.ext
и CamelCase.ext
в lowercase.ext
.
Я могу сопоставлять ссылки на страницах, используя соответствие регулярному выражению для href="[^"]*"
и src="[^"]*"
это, похоже, отлично работает для идентификации ссылки и изображений в HTML.
Однако то, что мне нужно с этим сделать, это взять совпадение и запустить ToLowercase()
функцию для совпадений. Поскольку у меня много страниц, которые я хотел бы проанализировать, я хочу создать короткий сценарий оболочки, который будет запускаться в указанном каталоге, а шаблон будет соответствовать указанным регулярным выражениям и выполнять операцию со строчными буквами над ними.
Комментарии:
1. Проверил преобразование sed
y
? grymoire.com/Unix/Sed.html#uh-49
Ответ №1:
Однострочник Perl для переименования всех обычных файлов в нижний регистр:
perl -le 'use File::Find; find({wanted=>sub{-f amp;amp; rename($_, lc)}}, "/path/to/files");'
Если вы хотите уточнить, какие файлы переименованы, вы можете изменить -f
на регулярное выражение или что-то в этом роде:
perl -le 'use File::Find; find({wanted=>sub{/.(txt|htm|blah)$/i amp;amp; 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-адреса (возможно, /
s в 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. Спасибо. Получение сообщения об ошибке «Замена замены не завершена в строке -e 1». хотя. Синтаксическая ошибка?
2. Какая команда? Это не должно иметь значения, потому что я просто вставил все три команды в свой терминал, и они выполнялись правильно…
3. Я попробовал последний, поскольку именно тот, который, как вы указали, будет работать в файлах. Возможно, это проблема со сборкой / версией perl? Я использую Macbook.
Ответ №2:
С помощью 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
Ответ №3:
вы этого хотите?
kent$ echo "aBcDEF"|sed 's/.*/Lamp;/g'
abcdef
или это
kent$ echo "aBcDEF"|awk '$0=tolower($0)'
abcdef
с вашим собственным регулярным выражением:
kent$ echo 'FOO src="htTP://wWw.GOOGLE.CoM" BAR BlahBlah'|sed -r 's/src="[^"]*"/Lamp;/g'
FOO src="http://www.google.com" BAR BlahBlah
Ответ №4:
Вы могли бы использовать sed
with -i
(редактирование на месте):
sed -i'' -re's/(href|src)="[^"]*"/Lamp;/g' /path/to/files/*
Комментарии:
1. Есть ли синтаксическая ошибка в этом примере? Когда я пытаюсь это сделать на своем Macbook, я получаю сообщение: sed: 1: «/ path/to /files / …»: команда a ожидает , за которым следует текст (очевидно, что / path /to /files / — это не то, что я ввожу в качестве пути.)
2. Обратите внимание, что в конце есть
*
(звездочка).sed
ожидает не каталог, а один или несколько файлов. Используя filemask, ваша оболочка должна расширить путь к соответствующим файлам (я использовал*
, что означает «все файлы»).3. * был включен в путь к файлу.
4. Возможно, ваша оболочка не расширяет маски файлов в файлы. Вы можете использовать xargs для этой цели:
ls /path/to/files/* | xargs sed -i'' -re's/(href|src)="[^"]*"/Lamp;/g'
. Если у вас есть пробелы в именах файлов, вам понадобится что-то вроде этого:find /path/to/files/ -maxdepth 1 -print0 | xargs -0 sed -i'' -re's/(href|src)="[^"]*"/Lamp;/g'
или, с помощью -exec:find /path/to/files/ -maxdepth 1 -exec sed -i'' -re's/(href|src)="[^"]*"/Lamp;/g' "{}";