我想從一堆文件中提取數字(0.000500
)aláeta_x2-0.000500
。 我會認爲下線會這樣做,但我只得到0
而不是0.000500
。爲什麼sed匹配最小而不是最大字符串?
如何獲得最大匹配?
find eta* | sed 's/.*\([0-9.]\+\)/\1/g'
我想從一堆文件中提取數字(0.000500
)aláeta_x2-0.000500
。 我會認爲下線會這樣做,但我只得到0
而不是0.000500
。爲什麼sed匹配最小而不是最大字符串?
如何獲得最大匹配?
find eta* | sed 's/.*\([0-9.]\+\)/\1/g'
的.*
是貪婪的,所以它會匹配儘可能多的字符可能。在這種情況下,.*
將與eta_x2-0.00050
匹配,而您的組中只匹配最後的0
。
通常這裏的答案是隻使用.*?
的非貪婪匹配,但我不認爲sed支持這一點。
你應該能夠得到這個被要求有一個非數字字符開始匹配之前的工作,這樣的.*
將消耗數字之前停止:
sed 's/.*[^0-9.]\([0-9.]\+\)/\1/g'
當然如果你知道你想要的數字會在-
之後,你可以用-
代替[^0-9.]
,它的工作方式也是一樣的。
不需要的sed
find eta* | grep -oP '(?<=-)[\s.]+'
find eta* | cut -d'-' -f 2
這應該工作 -
find eta* | sed 's/[^-]*-\([0-9]*\.[0-9]*\)/\1/'
由於FJ我太專注於端部和爲什麼似乎沒有表現貪婪,我忘記了第一個。這個概念讓我在sed中尋找貪婪。事實證明,我可能正在尋找的是'perl',它支持非貪婪修飾符,並且作爲獎勵並不需要那麼多\轉義。另外,perl具有像\ d和\ w這樣有用的簡寫形式。因此,我可以得到:'find eta * | perl -pe's |。*?(\ d + \。\ d +)| \ 1 |''。使用[this](http://nixtip.wordpress.com/2011/06/14/text-processing-performance-perl-vs-sed/),sed和perl似乎同樣快。那麼爲什麼還有人會使用sed? – AdamAL