【发布时间】:2018-11-15 19:57:22
【问题描述】:
我发现这个问题与我想要的非常相关:Parsing using awk or sed in Unix,但是我无法弄清楚以下内容的作用:
's/\([,=]\) /\1/g'
我知道 g 进行了全局替换,但真的无法理解问题上下文中发生了什么。
【问题讨论】:
标签: sed
我发现这个问题与我想要的非常相关:Parsing using awk or sed in Unix,但是我无法弄清楚以下内容的作用:
's/\([,=]\) /\1/g'
我知道 g 进行了全局替换,但真的无法理解问题上下文中发生了什么。
【问题讨论】:
标签: sed
这是一个简单的例子:
$ 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
【讨论】:
sed -E -e "s/[^/]{10}(\\.[^\\.]+)?$/\\1/"
\1 插入第一个捕获组的内容,这是第一组括号之间的匹配项。我不知道您是否特别询问带有双反斜杠的情况,但无论是否加倍,它似乎都有效。我不会说这是扩展正则表达式的情况,因为即使您使用基本正则表达式,它也会做同样的事情。
\(...\) 将捕获括号内指定的字符,\1 将用于引用第一个匹配项,这是正则表达式的一部分。
【讨论】:
\1 放回了括号之间匹配的任何内容,其中不包括空格。
sed -E 的扩展正则表达式,则不需要用反斜杠分隔括号。