2016-11-27 85 views
1

我試圖讓sed輸出它在一行文本中看到的第一個數字。下面是我使用的命令:爲什麼sed會將此替換的結果評估爲8?

sed 's/.*\([0-9]\+\).*/\1/g' 

據我瞭解,應該告訴sed採取從標準輸入,跳過一串字符,直到它擊中了許多,比賽和捕獲1或更多字符號碼,然後跳過該行中的其餘字符。然而,這並不成立,當我通過它試圖管道的東西:

[email protected] MINGW64 ~/Code/git/corefx (sparse-array-builder) 
$ tasklist | grep VBCSCompiler 
VBCSCompiler.exe    11080 Console     33 155,944 K 

[email protected] MINGW64 ~/Code/git/corefx (sparse-array-builder) 
$ tasklist | grep VBCSCompiler | sed 's/.*\([0-9]\+\).*/\1/g' 
8 

我希望第二個命令的輸出爲11080,但它是8。爲什麼會發生這種情況,因爲8甚至不是輸入中的第一個或最後一個數字,並且與一組也匹配的字符組合在一起?另外,在這裏使用正確的正則表達式是什麼?

感謝您的幫助。

回答

2

你的正則表達式的第一部分儘可能地進行貪婪匹配,並儘可能少地留下匹配的下一部分,這是字符串中的最後一個數字 - 因爲這個數字是內存的一部分用法,它可以在你的管道的不同執行之間改變。

如果設置了正則表達式的第一部分,以匹配任何非數字字符,那麼它會挑選出數你想:

tasklist | grep VBCSCompiler | sed 's/[^0-9]*\([0-9]\+\).*/\1/' 
+0

天色已晚,當我回答了這個:)它不對結果產生影響,但我仍會更新。 –