Perl oneliner in bash: print matches from complex regexp
我有这个复杂的正则表达式
1
| /"_outV":([0-9]+),"_inV":([0-9]+),"_label":"([a-z\\/]+)",/ |
,我需要解析一个文件(全部放在一行上),并仅输出匹配的组,例如
目前唯一可以使用的在线服务是
1 2
| perl -pe 'while(m/"_outV":([0-9]+)\\,"_inV":([0-9]+)\\,"_label":"([a-z\\/]+)"\\,/g){print"$1 $2 $3\
";}' |
但是在匹配之后,它最终还会在结尾处回显整个文件。
我该如何解决?
我虽然删除-p选项可以解决问题,但事实并非如此。
- 一些示例数据会有所帮助。看起来您有一些要解析的东西,并且您正试图对它进行正则表达式破解,这可能是解决它的错误方法。
-
我开始写一个答案,但现在我必须走了。我的意图是说您不应该为任何语言的单行程序而奋斗。两个级别的转义使所有内容都难以调试。除非您有充分的理由需要单行命令,而且我想不到有效的命令,否则最好将其作为Perl程序编写在单独的文件中。琐碎的正则表达式模式之外的所有操作都应使用更改定界符和使用/x修饰符的选项。复杂的单行代码适用于喜欢玩"技巧"的年轻程序员。它们不是专业用途,
-
@Borodin这并不复杂。
-
@ 123:复杂性是相对的。 OP说"我有这个复杂的正则表达式",所以对他们来说很复杂,要不然就不行了。
-
@Borodin您说的是复杂的单线,这不是一个单一循环。正则表达式将是复杂的(取决于用户),而不管它是否处于完整脚本中。
-
@ 123:这有点傻。您是我写过的"年轻程序员"之一吗?最琐碎的正则表达式模式可能很尴尬,无法像"单线"那样正确地逃脱,这是一种"复杂"的模式。我认为这也使单线复杂。最重要的是,如果OP并未尝试将所有内容都塞进一个bash命令中,那么他们的麻烦就少得多了。试图将代码"高尔夫"到无法维护的bash命令中是一种无利可图的文化,这是您应该在业余时间做的事情,而不是由雇主承担的费用。
-
@Kuzeko:我认为您正在处理JSON数据,而使用JSON模块来处理它比使用正则表达式要好得多。
-
@Borodin当然,如果不能完全忽略琐碎问题的单行代码,那我就成了young programmer。我绝对不同意"最琐碎"的正则表达式模式很难摆脱,唯一有问题的部分是使用单引号,OP是不是。最重要的是,OP唯一的问题是他们没有检查正在使用的标志,所以我怀疑他们会更方便地手动读取和写入文件。编写单行代码并不会自动使其变得不可读...使简单的一次性脚本过于复杂也无济于事。
-
@ 123:稻草人多少?我不同意。
-
@Borodin大论点,稻草人是哪一部分?我实际上只是回答您的观点。
对我很好。
您需要将-p替换为-n,这就是原因。
一些要点:
-
无需反斜线那些,和"。
-
您可以方便地将[0-9]替换为\\d。
-
通过对正则表达式使用其他定界符,您将不需要转义/。
优化最终结果
1 2
| perl -ne 'print"$1 $2 $3\
" while m{"_outV":(\\d+),"_inV":(\\d+),"_label":"([a-z/]+)",}g' |
- 很棒,而且优化效果更好!
-
强制性条件是,除非已安装/a修饰符,否则\\d和[0-9]是不等效的
-
@Borodin哈!我不知道/a :)另一个需要阅读的内容。为什么有人听我的话我永远不会知道。