2013-02-12 2 views
0

У меня есть две веб-страницы, одна страница была создана вручную, другая была опубликована с визуальной студией 2010 (.aspx). Я хочу изменить содержимое этих файлов, заменив кучу тегов скриптов одним тегом скрипта. Для достижения этой цели я просто запускаю некоторый код Perl из командного файла. Вот код Perl и HTML до и после подстановки:Перенос подстановки с многострочным

Perl в пакете:

perl -pi.backup -e "s/<!--\s*<pack>\s*-->.*?<!--\s*<\/pack>\s*-->/<script src=\"pack.js\"><\/script>/s" file.aspx 

HTML вход:

<!-- <pack> --> 
<script src="file1.js" type="text/javascript"></script> 
<script src="file2.js" type="text/javascript"></script> 
<!-- </pack> --> 

HTML выход:

<script src="pack.js"></script> 

Everything отлично работает для созданного вручную файла, а сгенерированный файл не обновляется, если все строки не собраны в один. Я предполагаю, что проблема исходит от строк, но я не могу понять, почему она работает только для первого файла, так как код точно такой же.

ответ

0

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

Вы могли бы сделать что-то вроде этого:

perl -i.backup -e "undef $/; $_=<>; s/<!--\s*<pack>\s*-->.*?<!--\s*<\/pack>\s*-->/<script src=\"pack.js\"><\/script>/s; print" file.aspx 

Он хлебает весь файл в $_, а затем выполняет вашу замену и выводит результат в тот же файл.

+0

Спасибо, это работает! Не могли бы вы объяснить, почему моя версия работает для одного из двух файлов? – leaf

+1

@wared, ваш файл, созданный вручную, может хранить разрывы строк в другом формате, который Perl не распознает. – 2013-02-12 10:54:52

+0

Хорошо, спасибо большое! – leaf