sed中的\ 1做什么?

Abd*_*aly 22 sed

我发现这个问题与我想要的完全相关:在Unix中使用awk或sed进行解析,但我无法弄清楚以下内容:

's/\([,=]\) /\1/g'
Run Code Online (Sandbox Code Playgroud)

我知道g会进行全局替换,但实际上无法理解问题背景下发生了什么.

Pau*_*ce. 39

这是一个简单的例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

在第三个命令中,指定了两个捕获组.它们通过使用\1和引用\2.最多可以使用九个捕获组.

除了g(全局)运算符(或没有它,第一个匹配),您可以指定特定匹配:

$ echo 'aaaaaa' | sed 's/a/A/4'
aaaAaa
Run Code Online (Sandbox Code Playgroud)

  • @Timo:`\1` 插入第一个捕获组的内容,它是第一组括号之间匹配的内容。我不知道你是否特别询问双反斜杠的情况,但无论它们是否双反斜杠似乎都有效。我不会说这是扩展正则表达式的情况,因为即使您使用基本正则表达式它也会做同样的事情。 (2认同)

med*_*iev 15

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

  • 好答案.我只是想补充一点,这意味着引用的特定示例会删除逗号或等号之后的空格,因为`\ 1`会放回parens之间匹配的内容,而不包括空格. (2认同)