回答:
入力例を挙げずに完全な答えを出すことはできませんが、キャプチャグループの理解が間違っていると言えます。連続して使用するのではなく、同じ置換演算子の左側の正規表現のみを参照します。たとえば、キャプチャする場合/(foo)(bar)(baz)/
、はfoo
になり\1
、bar
になり\2
、にbaz
なります\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/'
/(foo)/
、sedではリテラル(
文字に一致しfoo
、その後にリテラルが続き)
ます。グループをキャプチャする場合は、括弧をエスケープするか、-E
オプションを使用する必要があります。
-r
フラグを使用しているので、まだこれに遭遇していないのだと思います。
-r
フラグもそれを行いますが、移植性はありません。GNU sedはサポートしていますが、他の多くはサポートしていません。-E
より普遍的です。
例:
$ 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
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
個々の番号をキャプチャするようなものが必要です。