【发布时间】:2013-05-27 14:09:56
【问题描述】:
我的问题灵感来自一个有趣的question 有人在http://tex.stackexchange.com 提出的问题以及我提供 AWK 解决方案的尝试。注意这里的 AWK 表示 NAWK,因为我们知道 gawk != awk。我在这里复制了一些答案。
原问题:
我有一个包含大量数学符号的相当大的文档。我一直使用|foo| 来表示 foo 的绝对值。我想用\abs{foo} 替换|foo| 的每个实例,这样我就可以通过我定义的abs 宏来控制符号。
我的回答:
这篇文章的灵感来自 cmhughes 提出的解决方案。他的帖子是我读过的关于 TeX 编辑的最有趣的帖子之一。我只花了 2 个小时尝试生成 nawk 解决方案。在这个过程中,我了解到 AWK 不仅不支持非贪婪正则表达式,这是意料之中的,因为它是 sed 的表亲,而且更糟糕的是,AWK 正则表达式不支持它的组。 一个简单的 AWK 脚本
#!/usr/bin/awk -f
NR>0{
gsub(/\|([^|]*)\|/,"\\abs{\1}")
print
}
应用于文件
$|abs|$ so on and so fourth
$$|a|+|b|\geq|a+b|$$
who is affraid of wolf $|abs|$
不幸会产生
$\abs{}$ so on and so fourth
$$\abs{}+\abs{}\geq\abs{}$$
who is affraid of wolf $\abs{}$
上述解决方案的一个明显解决方法是使用 gawk 代替
awk '{print gensub(/\|([^|]*)\|/, "\\abs{\\1}", "g", $0)}'
但是我想知道是否有办法使用外部 regex 库 AWK 例如tre。更一般地说,一个 AWK 如何与 C 代码(指向文档的指针就可以了)。
【问题讨论】:
-
简单直接的解决方案似乎是切换到 Perl。 Perl 发行版中有一个脚本
a2p,它将 Awk 脚本转换为等效的 Perl 脚本,如果您更喜欢缓慢的学习曲线和近乎即时的结果而不是漂亮、可维护、惯用的 Perl 代码,这可能会有所帮助。
标签: regex awk regex-greedy