shell:在反引号中使用sed

2 shell escaping sed backticks

我想自动转义字符串中的一些特殊字符.我想到了回应那个字符串并通过一些seds管道.这似乎不适用于反叛内容.那么为什么呢

echo "foo[bar]" | sed 's/\[/\\[/g'
Run Code Online (Sandbox Code Playgroud)

返回

foo\[bar]
Run Code Online (Sandbox Code Playgroud)

FOO=`echo "foo[bar]" | sed 's/\[/\\[/g'` && echo $FOO
Run Code Online (Sandbox Code Playgroud)

回来

foo[bar]
Run Code Online (Sandbox Code Playgroud)

与sed相比,tr在反引号中完美运行:

FOO=`echo "foo[bar]" | tr '[' '-' ` && echo $FOO
Run Code Online (Sandbox Code Playgroud)

回报

foo-bar]
Run Code Online (Sandbox Code Playgroud)

ffo*_*orw 16

如何不使用反引号但使用$()?

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用反引号,我认为你需要额外逃脱所有\进入双\

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO
Run Code Online (Sandbox Code Playgroud)

  • '$()的+1.从不使用反引号.使用`$()`有很多优势.http://mywiki.wooledge.org/BashFAQ/082 (5认同)
  • 和评论的+1,参考Bash FAQ 82 (3认同)

Ale*_*ett 6

你需要逃避反引号之间的反斜杠.

FOO=`echo "foo[bar]" | sed 's/\\[/\\\\[/g'` && echo $FOO
Run Code Online (Sandbox Code Playgroud)

或者,使用$()(这实际上是推荐的方法).

FOO=$(echo "foo[bar]" | sed 's/\[/\\[/g') && echo $FOO
Run Code Online (Sandbox Code Playgroud)