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/'获取单个数字的方法。