转义用于sed替换的文件名

hae*_*lix 4 linux variables bash escaping sed

我怎样才能解决这个问题:

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

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

sar*_*old 7

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

$ abc="a/b/c"
$ echo porc | sed -r "s|^|$abc|"
a/b/cporc
$ 
Run Code Online (Sandbox Code Playgroud)

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


Rok*_*iša 6

GNU手册sed指出"所述/字符可以由任何给定的S指令内的任何其它单个字符被均匀地取代."

因此,只需使用另一个字符代替/,例如::

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

  2. 小心角色逃避.

    • 如果使用"",Bash将特别解释一些字符,例如`(用于内联执行),!(用于访问Bash历史记录),$(用于访问变量).

    • 如果使用'',Bash将按字面意思取得所有字符$.

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

      abc="a/b/c"; echo porc | sed 's!^!'"$abc"'!'
      
      Run Code Online (Sandbox Code Playgroud)