【发布时间】:2017-03-20 15:36:49
【问题描述】:
我有一个很长的 Latex 文档,并被要求将数学符号大写 A 的每个外观更改为小写 a。
唯一的问题是这个符号在乳胶数学表达式中重复了很多次(我猜超过 300 次)。它还在一个表达式中出现多次。
我想手动修复这个需要付出相当大的努力,更不用说我肯定会忽略许多替换。另外,请注意标准编辑器的正常“查找/替换”功能在这里是没有问题的,因为字母 A(不是数学符号 A)几乎出现在文档中的任何地方。
所以我认为正则表达式是解决我问题的好选择;但是,我需要确保我做对了,这就是这篇文章的主要原因。如果有人可以查看下面的正则表达式并告诉我可能出现的问题以及如何解决它,我将不胜感激。
首先,我需要列出我想用 grep 修复的地方,所以我写道:
$ # list all the occurrences of "A" inside latex math environment
$ # i.e., surrounded by $ $
$ # Note that since $ is a special char in regex, we have to escape it
$ grep -n '\$[^\$]*A[^\$]*\$' doc.tex
这个 grep 按预期工作,但不是我想要的。为了说明这个问题,请考虑以下简单示例:
$ cat -n test.tex
1 Abc $y_1=A x$.
2 Abc $y_2=b x$. Abc $c^2$.
3 Abc $y_2=b x$.
4 Abc $y_1=A x$.
5 abc $y_1=x$.
6 abc abc. $E=mc^2$.
$ grep -n '\$[^\$]*A[^\$]*\$' test.tex
1:Abc $y_1=A x$.
2:Abc $y_2=b x$. Abc $c^2$.
4:Abc $y_1=A x$.
第 2 行由 grep 显示,但我不希望出现这种情况,因为匹配的 A 在数学环境分隔符之外。是否可以修复这个正则表达式,以避免类似于第二个匹配的情况?我想我的问题可以概括为询问正则表达式是否可以了解其上下文?
如果我想解决我的问题,我会建议以下“抽象想法”:
B = TRUE
For every match that grep finds
If B is TRUE
Display the match
End if
B = not B
End for
换句话说,当 grep 找到匹配项时,仅当 B 为 TRUE 时才显示它,反转 B,并对所有匹配项重复。
这个想法应该可行,因为我的文档中没有嵌套的数学表达式。那么我们可以用 grep 来实现这个想法吗?或者有什么更好的主意吗?
【问题讨论】:
-
第 2 行的第二部分,
$. Abc $c^2$在$..$之间存在A,如何避免这种情况(条件)? -
您可以使用单词边界来限制独立的字母匹配,但仍然需要担心跨越多行的数学环境,或文本中美元符号的其他用途。
-
您可以考虑将原始的
A替换为适当的命令,这样以后如果您需要将小写的as 再次更改为其他内容,您只需更改命令的定义在一处。 -
嗨@Inian:我在帖子中写的“抽象”想法怎么样?你不认为它可以解决我的问题,或者至少在概念上吗?你不觉得这是可以实现的吗?
-
嗨@karakfa:真实有效的cmets,谢谢。