2017-02-10 3 views
3

Я пытаюсь удалить все комментарии в кучу SGF файлов, и придумали следующую команду: PERLPerl не соответствует регулярному выражению?

perl -pi -e 's/P?C\[(?:[^\]\\]++|\\.)*+\]//gm' *.sgf 

Я пытаюсь соответствовать и удалить C или ПК с последующим слева, а затем символы, которые не являются правильными скобками (если они должны быть экранированы с помощью \), а затем правой скобки.

Я пытаюсь соответствовать следующие примеры:

C[HelloBot9 [-\]: GTP Engine for HelloBot9 (white): HelloBot version 0.6.26.08]

PC[IA [-\]: GTP Engine for IA (black): GNU Go version 3.7.11 
] 

C[person [-\]: \\\]]

C[AyaMC [3k\]: GTP Engine for AyaMC (black): Aya version 6.61 : If you pass, AyaMC 
will pass. When AyaMC does not, please remove all dead stones.] 

и некоторые примеры, которые не должны быть совпавшие:

XYZ[Other stuff \]]

C[stuff\]

PC[stuff\\\]

Регулярное выражение работает в нескольких интернет-тестеров регулярных выражений (в том числе несколько, которые они состоянии Perl тестеры регулярных выражений), но по какой-то причине не работает в командной строке. Помощь приветствуется.

+1

Онлайн-тестеры регулярных выражений Я видел, что все используют PCRE, а не Perl-регулярное выражение, поэтому результаты не будут отображаться n возможно, будут одинаковыми. Кроме того, модификатор '/ m' бесполезен, потому что вы не используете никаких якорей'^'или' $ '; см. [perlre] (http://perldoc.perl.org/perlre.html#*m*). – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot А, это имеет больше смысла. Я до сих пор не знаю, как это сделать. – eukaryote

+0

Когда я запускаю ваш код в первом наборе примеров, он работает. Можете ли вы создать [mcve]? – ThisSuitIsBlackNot

ответ

1

Вам необходимо запустить perl с опцией -0777, чтобы убедиться, что содержимое, охватывающее линии и соответствующее шаблону, можно найти. Таким образом, использование perl -0777pi -e вместо perl -pi -e решит проблему.

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

s/P?C\[[^]\\]*(?:\\.[^]\\]*+)*]//sg 

Обратите внимание, что если PC должен быть согласован как целое слово, добавить \b перед тем P.Подробнее

шаблон:

  • P?C\[ - либо PC[ или C[ последовательности литералов символ
  • [^]\\]* - ноль или более символов других, чем \ и ]
  • (?:\\.[^]\\]*+)* - ноль или более последовательностей:
    • \\. - буквальный \, а затем любой символ (.)
    • [^]\\]*+ - буквальный ] символа (примечание - 0+ кроме ] и \ (не соответствуют собственнический, не отступают в шаблон)
  • ] символов он не должен выходить за пределы класса символов для обозначения литерального закрывающего кронштейна)
Смежные вопросы