如何在sed中转义字符

时间:2016-03-06 06:30:27

标签: sed

我正在尝试使用sed从多个文件中删除一些文本。这是我要删除的文字:

\once override TupletBracket #'stencil = ##f

我在sed中尝试过这行,但我无法让它工作:

sed -i '' -e 's/\\once \\override TupletBracket #'stencil = ##f//g' *ily

我尝试转义#符号,'=,但仍然没有乐趣。有谁能指出我正确的方向?

3 个答案:

答案 0 :(得分:1)

我认为在这里使用单引号而不是双引号来避免额外的\和其他可能的扩展(例如变量)会更好。如果您需要文字单引号,请关闭引号,添加\',然后为剩余部分开始新的引用。

$ cat in
before \once override TupletBracket #'stencil = ##f after
$ sed 's/\\once override TupletBracket #'\''stencil = ##f//g' in
before  after

答案 1 :(得分:0)

您无法直接在使用'引用的sed命令中使用'。请使用双引号并匹配\,您需要使用\\\\\,即\

$ sed "s/\\\once override TupletBracket #'stencil = ##f//g"
\once override TupletBracket #'stencil = ##f

hello \once override TupletBracket #'stencil = ##f xyz
hello  xyz
$

答案 2 :(得分:0)

#=不是RE元字符,也没有任何其他特殊含义可以在正则表达式中进行sed(=在regexp之外),除非regexp与一个正则表达式分隔他们没有理由在你的剧本中逃脱它们。 '仅在整个脚本与'分隔时才有意义,因为在shell中没有由给定字符分隔的脚本可以包含该字符。所以,这是您的选择:

$ echo "seab'cd" | sed 's/b'\''c/foo/'
seafood

$ echo "seab'cd" | sed "s/b'c/foo/"
seafood

请注意,如果您使用第二个(双引号)版本,那么您将允许shell变量在脚本内部扩展,并且需要使用双反斜杠来转义字符。

我期望使用'的八进制表示(即\047)会像在awk中那样工作:

$ echo "seab'cd" | awk '{sub(/b\047c/,"foo")}1'
seafood

但它没有:

$ echo "seab'cd" | sed 's/b\047c/foo/'
seab'cd

我怀疑这是因为sed将\0视为反向引用。它确实适用于十六进制表示:

$ echo "seab'cd" | sed 's/b\x27c/foo/'
seafood

但这很危险,应该避免(见http://awk.freeshell.org/PrintASingleQuote)。