Bash 取代#&引用&引用$&引用"E;%&引用&引用&&引用;,及_&引用;加上\#&引用&引用\$&引用"E;\%&引用&引用\&&引用;,及\_&引用;
我有一个纯文本文档,我想在LaTeX中编译它。但是,有时它有字符“#”、“$”、“%”、“&”和“#”。为了在LaTeX中正确编译,我必须首先将这些字符替换为“\”、“\$”、“\%”、“\&”和“\”。我在Bash 取代#&引用&引用$&引用"E;%&引用&引用&&引用;,及_&引用;加上\#&引用&引用\$&引用"E;\%&引用&引用\&&引用;,及\_&引用;,bash,latex,sed,escaping,grep,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.tx
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
sed -i -E 's/([#$%&_\])/\\&/g' file.txt
这是正确的吗
不幸的是,该文件太大,无法在任何GUI软件中打开,因此很难使用文本编辑器检查我的sed
行是否正确。我尝试使用grep
进行搜索,但搜索没有按预期进行(例如,在下面,我搜索了包含“$”的任何行):
- 在这些字符前面放置“\”的最佳方式是什么
- 如何使用
成功检查替换行grep
- 你所拥有的在我看来是正确的。但警告:它也将双重转义,例如,已转义的
。如果这不是您想要的,您可能需要修改您的模式,以检查是否已经存在前一个\项李>\\\
- $用于bash命令替换语法。我想
应该满足您的期望grep“\\$”file.txt
在大多数情况下,第一个(搜索)字符串上不需要
- 我认为您的问题在于bash本身正在处理这些越狱
\
,只需要$
(这是一个特殊字符,表示行尾;其余字符并不特殊)。在替换中,您只需要两个\\
,而不是三个。此外,您还可以使用多个-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解释\
('\$'
),或者添加另一对\\
:“\\$”。大概,这就是您从中获取
\`的地方,但您不需要在编写的sed
中使用它。您可以通过调用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
sed -i -E 's/([#$%&_\])/\\&/g' file.txt
替换文本中的
&
填充括号中的任何单个字符。请注意,由于\
是LaTeX转义字符,因此您也必须在原始文件中转义它。我不响应sed
,其他答案很好;-)
您可以使用less
作为查看器查看您的大型文件(或more
,但less
比more
更舒适)
对于搜索,您可以使用fgrep
:它忽略正则表达式=>fgrep'\$'
将真正搜索文本\$
fgrep
与调用grep-F
相同
编辑:
fgrep'\$”
和fgrep“\$”
是不同的。在第二种情况下,bash
解释字符串并将其替换为单个字符:$
(即,fgrep
将只搜索$
。您能保证没有任何已转义的特殊字符吗?如果不是预期的,grep如何工作?当我运行grep“\$”file.txt
它似乎正在打印所有内容或几乎所有内容。我不知道它为什么要打印这么多文本,因为“$”非常罕见。我认为文档中不太可能已经有转义字符。“\”经常出现,但我不知道在什么情况下它会被用作转义字符。请尝试grep'\\\$'file.txt
。如果您没有转义反斜杠(和美元符号),那么美元符号将转义,这将告诉grep
查找一个文字“$”(而不是行尾-因为“$”在正则表达式中有特殊含义)。既然“$”是特殊的,它是否需要三个`(例如
\\`)前面?@Village不在替换项中。不需要括号。某些版本的sed
不支持-E
,而是使用-r
。一些版本的sed
需要在-i
之后进行扩展,但由于OP没有在问题中提供扩展,因此可以安全地假设它不需要。所有这些都是好的。我想说的是-E将取决于使用中的sed版本,但必须从最终版本中删除它。实际上,您可能想将`更改为\textbackslash',因为“\`断线。