#perl #command-line
#perl #командная строка
Вопрос:
Я пытаюсь найти <li ><a href='xxxxxxxx'>some_link</a></li>
и заменить его ничем. Для этого я запускаю приведенную ниже команду, но она распознает $ как часть регулярного выражения.
perl -p -i -e 's/<li ><a href=.*$SOMEVAR.*li>n//g' file.html
Я пробовал следующие вещи,
${SOMEVAR}
$SOMEVAR
FIND="<li ><a href=.*$SOMEVAR.*li>"; perl -p -i -e 's/$FIND//g' file.html
Есть идеи? Спасибо.
Комментарии:
1. Спасибо, что заставили меня посмотреть, что
-i
делает флаг. Это круто. Совет профессионала: вы можете объединить все флаги следующим образом:-pie
2. Кроме того, спасибо за солидный первый пост. Проблема кратко описана вместе с попытками решения. Молодец.
3. @Chriszuma вы пробовали комбинацию фактического пирога?
4. Черт возьми, нет, я этого не делал. Кажется, вы не можете объединить эти 3, но вы все равно можете это сделать
-i -pe
.
Ответ №1:
Bash выполняет подстановку переменных только в двойные кавычки.
Это должно сработать:
perl -p -i -e "s/<li ><a href=.*?$SOMEVAR.*?li>n//g" file.html
РЕДАКТИРОВАТЬ На самом деле, это может показаться странным с n
in там. Другой подход заключается в использовании конкатенации строк в Bash. Это должно сработать:
perl -p -i -e 's/<li ><a href=.*?'$SOMEVAR'.*?li>n//g' file.html
РЕДАКТИРОВАТЬ 2: я только что внимательно посмотрел на то, что вы пытаетесь сделать, и это довольно опасно. Вы используете жадную форму .*
, которая может соответствовать намного большему количеству текста, чем вы хотите. Используйте .*?
вместо этого. Я обновил приведенные выше регулярные выражения.
Комментарии:
1. Порядок переключателей не имел значения для моего случая (исходя из
sed -ri
поддержки поиска регулярных выражений), но мне пришлось разделить короткие переключатели, если я не получу ошибкуCan't open perl script ...: No such file or directory
для своего-e <code>
параметра.
Ответ №2:
Если «SOMEVAR» действительно является внешней переменной, вы можете экспортировать ее в среду и ссылаться на нее таким образом:
SOMEVAR=whatever perl -p -i -e 's/<li ><a href=.*$ENV{SOMEVAR}.*li>n//g' file.html