2011-11-30 28 views
0

我正在嘗試用Perl讀取文件中某一行的特定部分。 有問題的文件的語法如下。重複自己的Perl oneliner匹配

# Sets $USER1$ 
$USER1$=/usr/.... 
# Sets $USER2$ 
#$USER2$=/usr/... 

我oneliner很簡單,

perl -ne 'm/^\$USER1\$\s*=\s*(\S*?)\s*$/m; print "$1";' /my/file 

出於某種原因,我得到$ 1,每行文件中重複了幾次,顯然曾經是我的比賽後發生的提取。我在這裏錯過了什麼?

+0

你需要一個條件來測試匹配,如'打印,如果/..your正則表達式../;' – 2011-11-30 22:22:29

回答

5

您對文件的每一行執行打印,因爲打印被要求每行,無論是正則表達式匹配與否。將第一個;替換爲&&

+0

或重置'$ 1 =「」'後的每一行,但這是那麼優雅。 –

+0

完美,謝謝。認爲這是某種邏輯條件問題。 –

+1

你不能重置$ 1,因爲它是一個只讀變量 – ennuikiller

0

試試這個

perl -ne '/^.*1?=([\w\W].*)$/;print "$1";' file 
2

從perlre:

注意:在Perl失敗的比賽不要重置匹配的變量,這使得它更容易編寫了一系列更具體的情況下測試代碼和記得最好的匹配。

試試這個:

perl -ne 'print "$1" if m/^\$USER1\$\s*=\s*(\S*?)\s*$/m;' /my/file 
1
$ cat test.txt 
# Sets $USER1$ 
$USER1$=/usr/.... 
# Sets $USER2$ 
#$USER2$=/usr/... 

$ perl -nle 'print if /^\$USER1/;' test.txt 
$USER1$=/usr/....