[英]perl oneliner print the array and other match in same print statement
我有一組包含示例數據的文件,如下所示,我需要轉換數據以將-o
之后的所有目標文件放在第一列中,並在-l
之后將鏈接庫放在第二列中。 這種格式在整個 make 輸出中是一致的。
hello there -o one two three four -labc -lfoo -lbar
something useless -o abc doo zoo -lkoo -lfoo -lmoo
我正在嘗試將其解析為更簡單的格式以供進一步處理:
one two three four, abc foo bar
abc doo zoo, koo foo moo
我正在嘗試這個,顯然這不是我想要得到的:
perl -ne '/-o(.*?)-/m; @libs = /-l([^ ]+)/gs; printf "%s %s\n", $1 , join(", ", @libs);' inputfile
bar
abc, foo, bar
moo
koo, foo, moo
在這里,我試圖將所有對象存儲到$1
和@libs
數組中的所有庫中。 只有 libs 打印正確,但對象不正確,有人可以幫忙修復嗎? 我分別驗證了$1
的價值是否正確。
perl -wne '/-o(.*?)-/m; printf "%s %s\n", $1, " "' inputfile
one two three four
abc doo zoo
同樣,當我單獨打印第二部分(庫)時,它也可以工作。
perl -ne '@libs = /-l([^ ]+)/gs; printf "%s\n", join(", ", @libs);' x
abc, foo, bar
koo, foo, moo
所以,當我將兩者結合在一起時,它只會搞砸。
perl -wnlE'
($o, @l) = /-(?:o|l) \s* ([^-]+) /gx;
s/^\s+|\s+$//g for $o, @l;
say join ", ", $o, "@l"
' file
在給定兩行的file
上打印
one two three four, abc foo bar
abc doo zoo, koo foo moo
為了使其按預期工作,至關重要的是有第一個-o
選項,然后是(可能是多個) -l
選項,以便-(o|l)
以正確的順序捕獲事物和($o, @l)
正確存儲它們。
此格式已在評論中確認,但如果有多個-o
條目或順序不同,那么最簡單的方法可能是將其分解為兩個正則表達式
@o = /-o\s*([^-]+)/ # capture all `-o` entries
@l = /-l\s*([^-]+)/ # capture all `-l` entries
然后打印
say join ", ", "@o", "@l";
由於可以在-o
之后列出多個文件,中間有空格,我們必須在模式中允許空格,因此也將捕獲尾隨的文件;因此有必要清理前導/尾隨空格。 這也是\s*
而不是\s+
的原因。
(我希望通過調整模式應該能夠糾正這個問題,這樣就不需要捕獲后清理,但我現在看不到。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.