Perl один лайнер, чтобы найти и заменить в файле с переменной - PullRequest
10 голосов
/ 28 октября 2011

Я пытаюсь найти <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

Есть идеи? Спасибо.

Ответы [ 2 ]

11 голосов
/ 28 октября 2011

Bash выполняет подстановку переменных только в двойных кавычках.

Это должно работать:

perl -p -i -e "s/<li ><a href=.*?$SOMEVAR.*?li>\n//g" file.html

EDIT На самом деле, это может показаться странным, если \nтам.Другой подход заключается в использовании конкатенации строк в Bash.Это должно сработать:

perl -p -i -e 's/<li ><a href=.*?'$SOMEVAR'.*?li>\n//g' file.html

РЕДАКТИРОВАТЬ 2: Я просто более внимательно посмотрел на то, что вы пытаетесь сделать, и это отчасти опасно.Вы используете жадную форму .*, которая может соответствовать намного большему количеству текста, чем вы хотите.Используйте .*? вместо этого.Я обновил вышеприведенные регулярные выражения.

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

Если «SOMEVAR» действительно является внешней переменной, вы можете экспортировать ее в среду и ссылаться на нее следующим образом:

SOMEVAR=whatever perl -p -i -e 's/<li ><a href=.*$ENV{SOMEVAR}.*li>\n//g' file.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...