回答:
入力例を挙げずに完全な答えを出すことはできませんが、キャプチャグループの理解が間違っていると言えます。連続して使用するのではなく、同じ置換演算子の左側の正規表現のみを参照します。たとえば、キャプチャする場合/(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/'個々の番号をキャプチャするようなものが必要です。