【问题标题】:Escape file name for use in sed substitution转义文件名以用于 sed 替换
【发布时间】:2012-01-16 09:22:41
【问题描述】:

我该如何解决这个问题:

abc="a/b/c"; echo porc | sed -r "s/^/$abc/"
sed: -e expression #1, char 7: unknown option to `s'

变量$abc 的替换是正确的,但问题是$abc 包含斜线,这会混淆sed。我能以某种方式避开这些斜线吗?

【问题讨论】:

    标签: linux bash variables sed escaping


    【解决方案1】:

    请注意,sed(1) 允许您为 s/// 分隔符使用不同的字符:

    $ abc="a/b/c"
    $ echo porc | sed -r "s|^|$abc|"
    a/b/cporc
    $ 
    

    当然,如果你走这条路,你需要确保你选择的分隔符没有在你输入的其他地方使用。

    【讨论】:

      【解决方案2】:

      GNU manual for sed 声明 “/ 字符可以统一替换为任何给定 s 命令中的任何其他单个字符。”

      因此,只需使用其他字符代替/,例如:

      abc="a/b/c"; echo porc | sed -r "s:^:$abc:"
      
      1. 不要使用可以在您的输入中找到的字符。我们可以使用上面的:,因为我们知道输入 (a/b/c/) 不包含 @ 987654329@.

      2. 注意字符转义。

        • 如果使用"",Bash 会特别解释一些字符,例如`(用于内联执行)、!(用于accessing Bash history)、$(用于访问变量)。

        • 如果使用'',Bash 将按字面意思处理所有字符,甚至是$

        • 这两种方法可以结合使用,取决于你是否需要转义,例如:

          abc="a/b/c"; echo porc | sed 's!^!'"$abc"'!'
          

      【讨论】:

      • 哇,多么出色的解决方案。我不知道您可以使用与“/”不同的东西。即使现在我知道它,我也无法在手册中找到它。谢谢大家!
      • @haelix 我现在添加了对手册的引用,其中描述了这个“技巧”等等。
      【解决方案3】:

      您不必像其他人已经告诉您的那样,使用 / 作为模式并替换分隔符。我会选择:,因为它很少在路径中使用(它是 PATH 环境变量中的分隔符)。坚持一个并使用外壳内置的字符串替换功能使其防弹,例如${abc//:/\\:}(这意味着在${abc} 中将所有出现的: 替换为\:)以防: 是分隔符。

      $ abc="a/b/c"; echo porc | sed -r "s:^:${abc//:/\\:}:"
      a/b/cporc
      

      【讨论】:

      • 嗯,实际上它并不是防弹的,因为\n$abc 中的此类仍然会被解释,但它更接近了一步。
      【解决方案4】:

      反斜杠:

      abc='a\/b\/c'
      

      空间填充....

      【讨论】:

      • 将反斜杠放入该字符串往往很麻烦,尤其是因为您必须确定 shell 何时解释它们以及 sed 何时解释它们。跨度>
      【解决方案5】:

      至于问题的转义部分,我遇到了同样的问题,并通过可能优化的双 sed 解决了。

      escaped_abc=$(echo $abc | sed "s/\//\\\AAA\//g" | sed "s/AAA//g")
      

      使用三个 A 是因为否则在其转义反斜杠之后的正斜杠永远不会放在输出中,无论您在其前面放置多少个反斜杠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2022-10-21
        • 1970-01-01
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 2017-08-05
        相关资源
        最近更新 更多