sed 捕獲組不工作

sed 捕獲組不工作

我有一個格式的字串[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)/那麼foowill be \1barwill be\2bazwill 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

相關內容