2017-02-08 23 views
0

匹配我有這種複雜的正則表達式的Perl oneliner在bash:打印從複雜的regexp

/"_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-nhere 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哈!我不知道'/ a' :)另一個塊要讀取。爲什麼有人聽我說我永遠不會知道。 – bobbogo