sed分别用“\ _”,“\&”,“\ $”替换“_”,“&”,“$”

时间:2011-11-10 14:02:29

标签: linux latex sed

在写乳胶时,通常会有一个参考书目文件,有时包含_&$。例如,期刊名称“自然结构与分子生物学”,文章标题“估计新药开发的成本:它真的是1.80亿美元?”,卷号“suppl_2”。

所以我需要将这些符号分别转换为\_\&\$,即在前面添加反斜杠,以便latex编译器可以正确识别它们。我想用sed进行转换。所以我试过

sed 's/_/\_/' <bib.txt >new.txt

但生成的new.txt与bib.txt完全相同。我认为_\需要转义,所以我尝试了

sed 's/\_/\\\_/' <bib.txt >new.txt

但也没有希望。有人可以帮忙吗?感谢。

4 个答案:

答案 0 :(得分:12)

由于shell处理字符串的方式,你遇到了一些困难。反斜杠需要加倍:

sed 's/_/\\_/g'

请注意,我还添加了一个'g'来表示替换应该全局应用于线路,而不仅仅是第一场比赛。

要处理所有三个符号,请使用字符类:

sed 's/[_&$]/\\&/g'

(替换文字中的&符号是指代匹配文本的特殊字符,而不是字面符号字符。)

答案 1 :(得分:3)

sed 's/\([_&$]\)/\\\1/g'

e.g。

eu-we1:~/tmp# cat zzz
bla__h&thisis&not the $$end
eu-we1:~/tmp# sed 's/\([_&$]\)/\\\1/g' < zzz
bla\_\_h\&thisis\&not the \$\$end
eu-we1:~/tmp# 

答案 2 :(得分:1)

您需要逃离\。像这样:sed 's/_/\\_/' new.txt

编辑:另外,要修改new.txt,你需要传递sed -i标志:

sed -iBAK 's/_/\\_/' new.txt

答案 3 :(得分:1)

你需要逃避它两次。

➜  8080667  sed 's/_/\\_/' new.txt
In writing latex, usually there is a bibliography file, which sometimes contains \_, &, or $. For example, the journal name "Nature Structural & Molecular Biology", the article title "Estimating The Cost Of New Drug Development: Is It Really $802 Million?", and the volume number "suppl_2".
➜  8080667