转义用于sed替换的文件名

时间:2011-12-09 00:09:50

标签: linux bash variables sed escaping

我该如何解决这个问题:

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

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

5 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:6)

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

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

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

  2. 小心角色转义。

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

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

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

反斜杠:

abc='a\/b\/c'

空间填充......

答案 4 :(得分:0)

至于问题的逃避部分,我遇到了同样的问题,并通过可以优化的双重解决方案解决。

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

使用三A,因为否则在其输出前面的反斜杠后面的正斜杠永远不会放在输出中,无论你放在前面有多少反斜杠。