2011-01-05 155 views

回答

27

这里有一个简单的例子:

$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/' 
ababcabc 
$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/g' 
ababab 
$ echo 'abcabcabc' | sed 's/\(ab\)\(c\)/\1d\2/g' 
abdcabdcabdc 

在第一个命令,只有第一场比赛受到影响。在第二个命令中,每个匹配都会受到影响。在这两种情况下,\1都是指由转义括号捕获的字符。

在第三个命令中,指定了两个捕获组。他们被称为使用\1\2。最多可以使用九个捕获组。

除了g(全球)运算符(或没有它,第一场比赛),你可以指定一个特定的比赛:

$ echo 'aaaaaa' | sed 's/a/A/4' 
aaaAaa 
+0

什么是\\ 1做的,是否扩展了正则表达式? – Timo 2017-12-13 15:48:44

+0

这是\\ 1的示例:'sed -E -e“s/[^ /] {10}(\\。[^ \\。] +)?$/\\ 1 /”' – Timo 2017-12-13 16:03:55

+1

@Timo :'\ 1'插入第一个捕获组的内容,该内容是第一组括号之间匹配的内容。我不知道你是否特别要求使用加倍反斜杠的情况,但无论它们是否加倍,似乎都起作用。我不会说这是一个扩展正则表达式的情况,因为即使在使用基本正则表达式时它也会执行相同的操作。 – 2017-12-13 17:40:10

10

\(...\)将捕获在parens内指定的字符,而\1将用于引用第一个匹配,这是正则表达式的一部分。

+1

很好的回答。我只是想补充一点,这意味着引用的特定示例会删除逗号或等号后​​面的空格,因为\ 1会放回任何在包含空格之间匹配的空格。 – 2011-01-05 22:52:56

+0

如果你只参考第一场比赛,那么是否需要/ g? – 2011-01-05 22:53:15

+0

aka“back references” – SiegeX 2011-01-05 22:54:03