用“\#”,“\ $”,“\%”,“\&”和“\ _”替换“#”,“$”,“%”,“&”和“_”

时间:2012-01-21 03:56:35

标签: bash latex sed escaping grep

我有一个纯文本文档,我想在LaTeX中编译。但是,有时它有字符“#”,“$”,“%”,“&”和“_”。要在LaTeX中正确编译,我必须先用“#”,“\ $”,“\%”,“\&”和“_”替换这些字符。我在sed中使用了这一行:

sed -i 's/\#/\\\#/g' ./file.txt
sed -i 's/\$/\\\$/g' ./file.txt
sed -i 's/\%/\\\%/g' ./file.txt
sed -i 's/\&/\\\&/g' ./file.txt
sed -i 's/\_/\\\_/g' ./file.txt

这是对的吗?

不幸的是,该文件太大而无法在任何GUI软件中打开,因此使用文本编辑器检查我的sed行是否正确是很困难的。我尝试使用grep进行搜索,但搜索无法按预期工作(例如,在下面,我搜索了包含“$”的所有行):

grep "\$" file.txt
  • 将“\”放在这些角色前面的最佳方式是什么?
  • 如何使用grep成功检查包含替换的行?

4 个答案:

答案 0 :(得分:21)

您只需拨打一次sed

即可进行更换
sed -i -E 's/([#$%&_\])/\\&/g' file.txt

替换文本中的&将填入括号中的任何单个字符。请注意,由于\是LaTeX转义字符,因此您必须在原始文件中将其转义。

答案 1 :(得分:4)

sed -i 's/\#/\\\#/g' ./file.txt
sed -i 's/\$/\\\$/g' ./file.txt
sed -i 's/\%/\\\%/g' ./file.txt
sed -i 's/\&/\\\&/g' ./file.txt
sed -i 's/\_/\\\_/g' ./file.txt

大部分字符串上的第一个(搜索)字符串不需要\,只需要$(它是一个特殊字符,表示一行的结尾;其余的不是特别)。在替换中,您只需要两个\\,而不是三个。此外,您可以使用多个-e语句完成所有操作:

sed -i.bak -e 's/#/\\#/g'  \
           -e 's/\$/\\$/g' \
           -e 's/%/\\%/g'  \
           -e 's/&/\\&/g'  \
           -e 's/_/\\_/g' file.txt

您不需要双重转义(\\除外),因为它们是单引号。在grep中,bash正在解释$上的转义,因为它是一个特殊字符(特别是变量的符号),所以grep正在获取并搜索$,这是一个特殊字符,表示一行的结尾。您需要单引号以阻止bash解释\'\$',或者添加另一对\\"\\\$". Presumably, that's where you're getting the \`,但你写的sed并不需要它。

答案 2 :(得分:2)

我认为你的问题是bash本身正在处理那些逃脱。

  1. 你看起来对我来说是对的。但警告:它也会双倍地逃脱,例如已转义的\#。如果这不是您想要的,您可能希望修改模式以检查是否已存在前面的\。
  2. $用于bash命令替换语法。我想grep "\\$" file.txt应该做你期望的事。

答案 3 :(得分:2)

我没有回复sed,其他答案都很好; - )

您可以使用less作为查看器来检查您的大文件(或more,但lessmore更舒服。

要进行搜索,您可以使用fgrep:它会忽略正则表达式=> fgrep '\$'将真正搜索文字\$fgrep与调用grep -F相同。

编辑: fgrep '\$'fgrep "\$"不同。在第二种情况下,bash解释字符串并将其替换为单个字符:$(即fgrep仅搜索$