sed キャプチャ グループが機能しない

sed キャプチャ グループが機能しない

形式の文字列があります[0-9]+\.[0-9]+\.[0-9]。最初、2 番目、3 番目の数字を別々に抽出する必要があります。私の理解では、キャプチャ グループでこれができるはずです。 を使用してsed "s/\([0-9]*\)/\1/g最初の数字を取得し、 を使用sed "s/\([0-9]*\)/\2/gして 2 番目の数字を取得し、 を使用sed "s/\([0-9]*\)/\3/gして 3 番目の数字を取得できるはずです。ただし、いずれの場合も、文字列全体が取得されます。なぜこのようなことが起こるのでしょうか。

答え1

入力例がなければ完全な回答はできませんが、キャプチャ グループに関するあなたの理解が間違っていることは言えます。キャプチャ グループを連続して使用することはなく、同じ置換演算子の左側の正規表現のみを参照します。たとえば、 をキャプチャすると、 に/(foo)(bar)(baz)/なりfoo\1barなり\2bazになります\3。 は実行できませんs/(foo)/\1/; s/(bar)/\2/。2 回目のs///呼び出しではキャプチャ グループが 1 つしかないため、\2は定義されません。

したがって、3 つの数字のグループを取得するには、次の操作を行う必要があります。

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

エスケープされた括弧をすべて回避するには、-r、--regexp-extended を指定して Sed を使用します。

echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/' 
1234, 567, 89    #output

関連情報