Answers:
没有输入示例,我们无法为您提供完整的答案,但是我可以告诉您,您对捕获组的理解是错误的。您无需顺序使用它们,它们仅引用同一替换运算符左侧的regex。例如,如果您捕获,/(foo)(bar)(baz)/
则foo
将会是\1
,bar
将会是\2
和baz
将是\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/'
/(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/'
获取单个数字的方法。