2013-07-15 89 views
2

我試圖提取一組一個Perl的單行字符的羣體,但我一直不成功:Perl的一個班輪提取字符

echo "hello_95_.txt" | perl -ne 's/.*([0-9]+).*/\1/' 

返回任何內容,而我會把它想返回95。我如何用Perl做到這一點?

更新:

需要注意的是,相較於建議重複的,我感興趣的是如何從命令行做到這一點。當然這看起來像一個微妙的差異,但它不是直截了當的,除非你已經知道如何有效地使用Perl單線程。因爲大家都在問,最終我想學習使用Perl編寫強大的單行程式,但是大多數情況下,我需要一行一行的方式從大文本文件中的每行中提取連續的數字。

+1

這不是Perl,它是sed。你想做什麼?從文件名中提取整數? – 2013-07-15 22:57:33

+0

謝謝@YatinSaraiya我已經更新了我的OP。我想使用Perl,而不是sed。 –

+0

最後我想用這一行代碼在大文本文件中提取每行的連續數字 –

回答

7
perl -pe's/\D*(\d+).*/$1/' 

perl -nE'/\d+/&&say$&' 

perl -nE'say/(\d+)/' 

perl -ple's/\D//g' 

,或者可以是

perl -nE'$,=" ";say/\d+/g' 
+0

'$&'寫得更好(\ d +)&&說$ 1'。 – squiguy

+0

@squiguy是的,它會更快但更長。 –

+1

謝謝! - 這三種選擇有什麼區別? –

0

首先,您需要使用-p而不是-n開關。

而你需要修改你的正則表達式,如:

echo "hello_95_.txt" | perl -pe "s/^.*?([0-9]+).*$/\1/" 

其查找字符的最長非貪婪的字符串,然後由一個或多個數字,後跟任意數量的字符給的隊伍的盡頭。

請注意,儘管'\ 1'可以作爲後臺參考,並且對SED/AWK用戶更爲熟悉,'$ 1'是最新的形式。因此,您可能希望使用:

echo "hello_95_.txt" | perl -pe "s/^.*?([0-9]+).*$/$1/" 

改爲。

+0

RHS中控制-A的處理是什麼? – tchrist

+0

@tchrist,嗯......我的答案中沒有控制-A。你指的是什麼? –

+1

'$ echo「hello_95_.txt」| perl -Mwarnings = FATAL,all -pe「s /^.*?([0-9] +)。* $/\ 1 /」 非法變量名稱。 $ echo「hello_95_.txt」| perl -Mwarnings = FATAL,all -pe's /^.*?([0-9] +)。* $/\ 1 /' \ 1在-e第1行更好地寫爲$ 1。 退出255' – tchrist