鍍金池/ 問(wèn)答/Linux/ sed 正則匹配的機(jī)制?

sed 正則匹配的機(jī)制?

使用sed做正則匹配時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題:
為了匹配一個(gè)特定英文之后的數(shù)字(例如id123,取出123),寫(xiě)了下面的正則

echo "s1" | sed -rn 's/^.*s([0-9]*).*$/\1/p'
輸出為1,匹配到了s1中的數(shù)字1

echo "s1s" | sed -rn 's/^.*s([0-9]*).*$/\1/p'
輸出為空,沒(méi)有匹配到s1?

為什么和我想的不一樣呢?
s[0-9]*為什么不匹配s1s呢,我前后寫(xiě)的都是.*呀。

不了解正則匹配的機(jī)制,請(qǐng)大神幫忙給講講。
謝謝謝謝~

回答
編輯回答
孤客
^.*s([0-9]*).*$
^ 開(kāi)始 $結(jié)尾
.任意非換行字符
*0次或任意次
()分組
/\1/取出分組的第一個(gè)相當(dāng)于group(1)  group(0)是滿足正則匹配的最長(zhǎng)字段
echo "s1" | sed -rn 's/^.*s([0-9]*).*$/\1/p' 所以第一組是1
echo "s1s" | sed -rn 's/^.*s([0-9]*).*$/\0/p' 全部匹配到了s1s
echo "s1s" | sed -rn 's/^.*s([0-9]*).*$/\1/p' 空,因?yàn)?*s貪婪的匹配了s1s 所以()分組匹配*次為0什么都沒(méi)匹配到
echo "s1s" | sed -rn 's/^.*s([0-9]+).*$/\1/p' 改為至少匹配一次就匹配到了
2017年6月22日 21:12