Как избежать слеш в тексте Perl, используемом в регулярном выражении - PullRequest
2 голосов
/ 11 июня 2010
end_date=$(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s/_end_date_/${end_date}/g" filename

Я хочу заменить строку '_end_date_' на текущую дату.Поскольку в текущей дате есть косые черты (да, я хочу косые черты), мне нужно их избежать.Как я могу это сделать?

Я пробовал несколько способов, таких как замена слешей на "/" с использованием sed и самого Perl, но это не сработало.Наконец, я использовал «вырезать», чтобы разбить дату на 3 части и избежать косой черты, но это решение выглядит не очень хорошо.Есть ли лучшее решение?

Ответы [ 4 ]

16 голосов
/ 11 июня 2010

В Perl вы можете выбрать, какой символ использовать для разделения частей регулярного выражения.Следующий код будет работать нормально.

end_date = $(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s#_end_date_#${end_date}#g" filename

Это делается для того, чтобы избежать синдрома «наклоняющейся зубочистки» с / чередованием.

5 голосов
/ 11 июня 2010

Используйте другой s разделитель: s{all/the/slashes/you/want/}{replacement}.

1 голос
/ 11 июня 2010

I будет рекомендовать изменить разделитель, но вы почти всегда можете обойтись с цитатой:

/usr/bin/perl -pi -e "my \$ed=quotemeta('${end_date}');s/_end_date_/\$ed/g" filename

Но у вас также есть этот маршрут:

/usr/bin/perl -pi -e 'BEGIN { use POSIX qw<strftime>; $ed=quotemeta(strftime( q[%m/%d/%Y], localtime())); } s/_end_date_/$ed/'

которая делает то же самое, что и ваши две строки.

0 голосов
/ 12 июня 2010

Опираясь на ответ Аксемана, у меня работает следующее:

 perl -MPOSIX=strftime  -p -e'$ed=strftime( q[%m/%d/%Y], localtime()) ;s/_end_date_/$ed/'

Несколько замечаний

  • Цитата не нужна, потому что компилятор не ищет / в переменной $ed.
  • Я использовал одинарные кавычки ' вместо ", так как в противном случае вам придётся цитировать $
  • Я предпочитаю использовать от -MPOSIX=strftime до BEGIN { use POSIX qw<strftime> }
...