如何在sed中转义字符

如何在sed中转义字符,sed,Sed,我正在尝试使用sed从多个文件中删除一些文本。这是我试图删除的文本: \once override TupletBracket #'stencil = ##f 我在sed中尝试过这一行,但无法使用: sed -i '' -e 's/\\once \\override TupletBracket #'stencil = ##f//g' *ily 我试着避开#符号、'和=但仍然没有乐趣。谁能给我指一下正确的方向吗?您不能直接在使用引用的sed命令中使用。改为使用双引号,为了匹配\,您需要使用\\

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

\once override TupletBracket #'stencil = ##f
我在sed中尝试过这一行,但无法使用:

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

我试着避开
#
符号、
'
=
但仍然没有乐趣。谁能给我指一下正确的方向吗?

您不能直接在使用
引用的sed命令中使用
。改为使用双引号,为了匹配
\
,您需要使用
\\\
来获得
\\
,即
\

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

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

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

$ cat in
before \once override TupletBracket #'stencil = ##f after
$ sed 's/\\once override TupletBracket #'\''stencil = ##f//g' in
before  after
#
=
不是元字符,它们在regexp中也没有任何其他特殊意义(在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

但这是危险的,应该避免(请参阅)。

可能的重复。需要引用
\`和
`的原因是不同的。在第一种情况下,
\`用于在替换命令的LHS中引用字符,因此也必须被引用。
“`是引用sed命令的shell的一部分,必须首先在shell中引用并连接到命令。