Perl one liner для поиска и замены в файле переменной

#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