簡體   English   中英

格式化perl正則表達式捕獲組

[英]Format perl regex capture groups

考慮以下情況。 這是假設的,但展示了我想要完成的一般事情。

假設我有一個文件,它有一行或多行。 在每一行上,它可能有一個或多個[name] = [value]實例,其中[name]是一些變量名, [value]是某個值。 進一步假設這些中的每一個都匹配/[a-zA-Z]+=[0-9]+/

我想要的是一個perl表達式,它將打印出每個匹配,以特定方式格式化。 我的意圖是在命令行上使用它來解析文件中的數據。 一個假設的解決方案,因為perl實際上不接受這種語法而無效: print m/([a-zA-Z]+)=([0-9]+)/name: \\1, value: \\2\\n/g ,當在每一行上運行時,在我們理想的世界中,將打印每行的每個匹配,如name:[name], value:[value] ,每個格式化的匹配在其自己的行上。

例如,考慮這個輸入文件test.txt:

blah blah count=5 blah i=1
books=2 blah
blah fairies=87 water=0

假設我們然后將我們的魔術命令輸入bash,如下所示:

perl -n -e 'print m/([a-zA-Z]+)=([0-9]+)/name: \1, value: \2\n/g' test.txt

(對所有返回的匹配要求某種循環可能更合理,但希望你能得到這個想法。)

它將打印以下內容:

name: count, value: 5
name: i, value: 1
name: books, value: 2
name: fairies, value: 87
name: water, value: 0

我意識到這種語法實際上並不起作用,但我希望盡可能簡單地完成同樣的事情。 我希望能夠偶爾在命令行中使用它來查找和格式化文本。 我編寫了自己的ruby腳本,但它有點兒麻煩,並沒有包含在標准環境中(或者在任何人的環境中,但我自己的)。 有人知道一些perl的秘密嗎?

你非常接近。 ;-)

$ perl -ne 'print "name: $1, value: $2\n" while /([a-zA-Z]+)=([0-9]+)/g;' test.txt
name: count, value: 5
name: i, value: 1
name: books, value: 2
name: fairies, value: 87
name: water, value: 0

編輯:因為你的評論似乎表明更短是更好,這里是一個削減了幾個字符的版本:

$ perl -lne 'print "name: $1, value: $2" while /([A-Z]+)=(\d+)/gi' test.txt

我的建議是 - 考慮選擇你的變量為哈希。

use Data::Dumper;
local $/;
my %stuff = <> =~ m/(\w+)=(\d+)/g;
print Dumper \%stuff ;

應該大概做你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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