![sed 捕獲組不工作](https://rvso.com/image/83666/sed%20%E6%8D%95%E7%8D%B2%E7%B5%84%E4%B8%8D%E5%B7%A5%E4%BD%9C.png)
我有一個格式的字串[0-9]+\.[0-9]+\.[0-9]
。我需要分別提取第一個、第二個和第三個數字。據我了解,捕獲組應該能夠做到這一點。我應該能夠用來sed "s/\([0-9]*\)/\1/g
取得第一個數字、sed "s/\([0-9]*\)/\2/g
第二個數字和sed "s/\([0-9]*\)/\3/g
第三個數字。但在每種情況下,我都會得到整個字串。為什麼會發生這種情況?
答案1
如果沒有您輸入的範例,我們無法給您完整的答案,但我可以告訴您,您對捕獲組的理解是錯誤的。您不會按順序使用它們,它們僅引用同一替換運算子左側的正規表示式。例如,如果您捕獲 ,/(foo)(bar)(baz)/
那麼foo
will be \1
、bar
will be\2
和baz
will be \3
。你不能這樣做s/(foo)/\1/; s/(bar)/\2/
,因為在第二次s///
呼叫中,只有一個捕獲組,因此\2
不會被定義。
因此,要捕獲三組數字,您需要執行以下操作:
sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
或者,更具可讀性:
sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/\1 : \2 : \3/'
答案2
例子:
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'
123
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'
456
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'
78
或者,一起:
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
123 : 456 : 78
答案3
將 Sed 與 -r, --regexp-extended 一起使用以避免所有轉義的括號。
echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/'
1234, 567, 89 #output