Как преобразовать соответствие шаблону регулярных выражений в нижний регистр для стандартизации / приведения в порядок URL

#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' "{}";