![sed キャプチャグループが機能しない](https://linux33.com/image/83666/sed%20%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84.png)
フォーマットされた文字列があります[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)/
will foo
be \1
、bar
will be、\2
will baz
be となります\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