我正在尝试使用 sed 来替换tex 文件中的&
by 。\&
我正在使用sed -i "s/ & / \\\& /g" bibfile.bib;
但是,文件中的结果\ &
并不\&
符合我的预期。欢迎任何帮助,马克
答案1
在类似 Bourne 的 shell 中,使用双引号意味着您需要对反斜杠进行一层额外的转义,就像\
在双引号内使用转义`
、"
、$
及其本身并进行行延续一样。
请改用单引号。
支持'...'
作为引用运算符的 shell 也比某些支持"..."
.
所以:
sed -i 's/ & / \\\& /g' bibfile.bib
sed
使用sed
、-i
、s/ & / \\\& /g
和作为四个单独的参数进行调用bibfile.bib
。
要使用双引号发送相同的参数,您至少需要:
sed -i "s/ & / \\\\\&" bibfile.bib
前两对\
变成一\
对并\&
留下来\&
。
sed -i "s/ & / \\\\\\&" bibfile.bib
IMO 也可以工作并且更干净,更明确地表明您希望将 3 个反斜杠传递给sed
,每个反斜杠都插入\\
双引号内。
你还可以这样做:
sed -i 's/ \(& \)/ \\\1/g' bibfile.bib
或者:
sed -Ei 's/ (& )/ \\\1/g' bibfile.bib
你的:
sed -i 's/ & / \\\& /g' bibfile.bib
实际上将sed
, -i
,s/ & / \\& /g
和bibfile.bib
作为参数传递给,它将其解释为以为sed
前缀并以 为后缀。" & "
" \"
" "
为了完整起见,在其他一些 shell 中:
csh/tcsh
在 csh/tcsh 中,nor\
内并不特殊(除了为了历史扩展而转义)。'...'
"..."
!
所以sed -i "s/ & / \\\& /g" bibfile.bib
和sed -i 's/ & / \\\& /g' bibfile.bib
都会在那里工作。
鱼
在鱼中,\
内部也很特殊'...'
,所以你需要:
sed -i "s/ & / \\\\\\& /g" bibfile.bib
或者
sed -i 's/ & / \\\\\\& /g' bibfile.bib
在一般情况下,后者仍然是首选,因为需要转义的字符较少。
RC
rc 只有一种引用形式:( '...'
not "..."
, \
nornornor )$'...'
$"..."
sed -i 's/ & / \\\& /g' bibfile.bib
只有在那里。
看如何在 Unix shell 中像普通字符一样使用特殊字符?有关哪些字符是特殊字符以及如何在各种 shell 中转义/引用它们的更多详细信息。
和 for ,在其命令sed
的替换部分中, the被解释为反斜杠和文字,而不是其扩展为匹配内容的特殊含义。s/pattern/replacement/flags
\\
\&
&