使用sed插入特殊字符的解决方案

Mar*_*arc 2 sed

我正在尝试使用 sed 来替换tex 文件中的&by 。\&我正在使用sed -i "s/ & / \\\& /g" bibfile.bib; 但是,文件中的结果\ &并不\&符合我的预期。欢迎任何帮助,马克

Sté*_*las 5

在类似 Bourne 的 shell 中,使用双引号意味着您需要对反斜杠进行一层额外的转义,就像\\在双引号内使用转义`"$及其本身并进行行延续一样。

\n

请改用单引号。

\n

支持\'...\'作为引用运算符的 shell 也比某些支持"...".

\n

所以:

\n
sed -i \'s/ & / \\\\\\& /g\' bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

sed使用sed, -i, s/ & / \\\\\\& /g\xc2\xb9 和bibfile.bib作为四个单独的参数进行调用。

\n

要使用双引号发送相同的参数,您至少需要:

\n
sed -i "s/ & / \\\\\\\\\\&" bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

前两对\\变成一\\对并\\&留下来\\&

\n
sed -i "s/ & / \\\\\\\\\\\\&" bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

IMO 也可以工作并且更干净,更明确地表明您希望将 3 个反斜杠传递给sed,每个反斜杠都插入\\\\双引号内。

\n

你还可以这样做:

\n
sed -i \'s/ \\(& \\)/ \\\\\\1/g\' bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
sed -Ei \'s/ (& )/ \\\\\\1/g\' bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

你的:

\n
\n
sed -i \'s/ & / \\\\\\& /g\' bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n
\n

实际上通过sed, -i,s/ & / \\\\& /gbibfile.bib作为参数传递给sed,它将其解释为以" & "为前缀" \\"并以 为后缀" "

\n
\n

为了完整起见,在其他一些 shell 中:

\n

csh/tcsh

\n

在 csh/tcsh 中,nor\\内并不特殊(除了转义\'...\'"..."!为了历史扩展而转义)。

\n

所以sed -i "s/ & / \\\\\\& /g" bibfile.bibsed -i \'s/ & / \\\\\\& /g\' bibfile.bib都会在那里工作。

\n

\n

在鱼里面,\\也很特别\'...\',所以你需要:

\n
sed -i "s/ & / \\\\\\\\\\\\& /g" bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
sed -i \'s/ & / \\\\\\\\\\\\& /g\' bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

在一般情况下,后者仍然是首选,因为需要转义的字符较少。

\n

RC

\n

rc只有一种引用形式:\'...\'(not "...", \\nornornor$\'...\'$"..." )

\n
sed -i \'s/ & / \\\\\\& /g\' bibfile.bib\n
Run Code Online (Sandbox Code Playgroud)\n

只有在那里。

\n

请参阅如何在 Unix shell 中将特殊字符用作普通字符?有关哪些字符是特殊字符以及如何在各种 shell 中转义/引用它们的更多详细信息。

\n
\n

\xc2\xb9 和 for ,在其命令sed的替换部分中,被解释为反斜杠和文字,而不是其扩展为匹配内容的特殊含义。s/pattern/replacement/flags\\\\\\&&

\n