Использование регулярного выражения в одной строке при редактировании Perl на месте - PullRequest
1 голос
/ 13 августа 2010

Я использую одноразовые команды perl -pi -e для простого поиска и замены из скрипта bash.Большинство моих регулярных выражений работают нормально, пока я не доберусь до этих:

perl -pi -e 's#\<\?mso-application.*\<Table.*Rows="1"\>#\<Table\>#s' 1.xml
perl -pi -e 's#\</Table.*#\</Table\>#s' 1.xml

Пожалуйста, не обращайте внимания на знаки # вместо слешей, я не хотел избегать еще большего количества символов.Предполагается, что эти регулярные выражения по существу удаляют фрагменты XML-файла, экспортированного из Excel, но не работают.Кажется, это происходит потому, что я использую логику, которая применяется к строкам, и пытаюсь применить ее к файлу (хотя я признаю, что у меня есть только базовое понимание редактирования на месте в Perl).альтернативный способ сделать это (в perl, awk или sed), который может быть выдан из сценария оболочки?

Ответы [ 4 ]

4 голосов
/ 13 августа 2010

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

4 голосов
/ 13 августа 2010

У вас есть настройка perl в режиме обработки строк, но есть вероятность, что шаблоны, которые вы пытаетесь найти, охватывают несколько строк.Вам нужно будет расширить свои сценарии Perl для чтения всего файла, а затем выполнить регулярные выражения для всего файла.

2 голосов
/ 13 августа 2010

В командной строке добавьте флаг -0777 , чтобы perl прочитал весь файл (и убедитесь, что у вас есть флаг / s для регулярного выражения, чтобы он соответствовал символам новой строки, что вы делаете).Итак:

perl -pi -0777 -e 's#\<\?mso-application.*\<Table.*Rows="1"\>#\<Table\>#s' 1.xml
perl -pi -0777 -e 's#\</Table.*#\</Table\>#s' 1.xml
2 голосов
/ 13 августа 2010

Пара вещей:

  • Избегайте использования регулярных выражений для манипулирования файлами XML, поскольку для этой работы существуют более совершенные инструменты. Рассмотрим модули XML::Simple или XML::Twig для достижения той же потребности.
  • Видя, что у вас есть несколько операций поиска и замены, замените однострочники соответствующим сценарием Perl и вместо этого вызовите его из сценария Bash.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...