2017-02-08 3 views
0

У меня есть этот сложный регулярное выражениеPerl Oneliner в Баш: печать совпадает со сложным регулярным выражением

/"_outV":([0-9]+),"_inV":([0-9]+),"_label":"([a-z\/]+)",/ 

и мне нужно, чтобы разобрать файл (который все на одной линии), и выход только совпавшие группы, такие как

print $1 $2 $3 

в настоящее время единственным почти работает Onliner является

perl -pe 'while(m/"_outV":([0-9]+)\,"_inV":([0-9]+)\,"_label":"([a-z\/]+)\"\,/g){print "$1 $2 $3\n";}' 

Но это заканчивается тем же, что и весь файл в конце, после матчей. Как это исправить?

Я считаю, что удаление опции -p сделало бы трюк, но это не так.

+1

Некоторые примеры данных поможет. Это похоже на то, что у вас есть что-то разобрать, и вы пытаетесь повторно использовать его, что, вероятно, является неправильным способом решения проблемы. – Sobrique

+1

Я начал писать ответ, но я должен идти сейчас. Мое намерение состояло в том, чтобы сказать, что вы не должны стремиться к однострочной программе на любом языке. Два уровня ускорения делают все ужасно трудным для отладки. Если у вас нет веских оснований для необходимости использовать однострочную команду, и я не могу придумать ее, она будет лучше написана в виде Perl-программы в отдельном файле. Все, что находится за пределами тривиального шаблона регулярного выражения, должно использовать варианты изменения разделителя и использования модификатора '/ x'. Комплексные однострочные для молодых программистов, которые любят играть «трюки»; они не предназначены для профессионального использования, – Borodin

+0

@Borodin Это сложно. – 123

ответ

2

Выглядит хорошо для меня. Вам необходимо: заменить-p с -n и here is why.

несколько тонкостей:

  • Нет необходимости обратной косой черты тех , и ".
  • Вы можете удобно заменить [0-9] на \d.
  • Используя другой разделитель для регулярного выражения, вам не нужно будет покидать /.

Конечный результат оптимизирован

perl -ne 'print "$1 $2 $3\n" while m{"_outV":(\d+),"_inV":(\d+),"_label":"([a-z/]+)",}g' 
+0

Удивительный, а оптимизация еще лучше! – Kuzeko

+1

Обязательным условием является то, что '\ d' и' [0-9] 'не являются эквивалентными, если не установлен модификатор'/a' – Borodin

+0

@Borodin Hah! Я не знал о '/ a' :) Еще один кусок для чтения. Почему никто никогда не слушает меня, я никогда не узнаю. – bobbogo

Смежные вопросы