簡體   English   中英

perl oneliner 在同一打印語句中打印數組和其他匹配項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM