我有一个纯文本文档,我想在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
成功检查包含替换的行?答案 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本身正在处理那些逃脱。
\#
。如果这不是您想要的,您可能希望修改模式以检查是否已存在前面的\。 grep "\\$" file.txt
应该做你期望的事。答案 3 :(得分:2)
我没有回复sed
,其他答案都很好; - )
您可以使用less
作为查看器来检查您的大文件(或more
,但less
比more
更舒服。
要进行搜索,您可以使用fgrep
:它会忽略正则表达式=> fgrep '\$'
将真正搜索文字\$
。 fgrep
与调用grep -F
相同。
编辑:
fgrep '\$'
和fgrep "\$"
不同。在第二种情况下,bash
解释字符串并将其替换为单个字符:$
(即fgrep
仅搜索$
。