【问题标题】:What does \1 in sed do?sed 中的 \1 有什么作用?
【发布时间】:2018-11-15 19:57:22
【问题描述】:

我发现这个问题与我想要的非常相关:Parsing using awk or sed in Unix,但是我无法弄清楚以下内容的作用:

's/\([,=]\) /\1/g'

我知道 g 进行了全局替换,但真的无法理解问题上下文中发生了什么。

【问题讨论】:

    标签: sed


    【解决方案1】:

    这是一个简单的例子:

    $ 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
    

    【讨论】:

    • \\1 在做什么,是扩展的正则表达式吗?
    • 这里是 \\1 的示例:sed -E -e "s/[^/]{10}(\\.[^\\.]+)?$/\\1/"
    • @Timo: \1 插入第一个捕获组的内容,这是第一组括号之间的匹配项。我不知道您是否特别询问带有双反斜杠的情况,但无论是否加倍,它似乎都有效。我不会说这是扩展正则表达式的情况,因为即使您使用基本正则表达式,它也会做同样的事情。
    【解决方案2】:

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

    【讨论】:

    • 好答案。我只是想补充一点,这意味着引用的具体示例删除了逗号或等号后​​面的空格,因为\1 放回了括号之间匹配的任何内容,其中不包括空格。
    • 如果只引用第一个匹配项,是否需要 /g?
    • 注意:如果您使用带有sed -E 的扩展正则表达式,则不需要用反斜杠分隔括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2021-09-24
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多