在 bibtex 文件上运行 detex,但保留整个文章周围的“{ }”

在 bibtex 文件上运行 detex,但保留整个文章周围的“{ }”

我有一个 bibtex 文件,其中包含类似条目

@article{Alesse.2003,
 author = {Alesse, Francesca},
 year = {2003},
 title = {Il tema dell'emanazione ({\dq}aporroia{\dq}) nella letteratura astrologica e non astrologica tra I sec. a.C. e II d.C.},
 pages = {117–133},
 volume = 5,
 journal = {MHNH: Revista internacional de investigaci{\'o}n sobre magia y astrolog{\'i}a antiguas}
}

我想对此进行检测,但保留最外层的“{}”,因此它应该看起来像

@article{Alesse.2003,
 author = Alesse, Francesca,
 year = 2003,
 title = Il tema dell'emanazione (aporroia) nella letteratura astrologica e non astrologica tra I sec. a.C. e II d.C.,
 pages = 117–133,
 volume = 5,
 journal = MHNH: Revista internacional de investigacion sobre magia y astrologia antiguas
}

默认情况下,detex 会删除所有花括号。如何才能阻止它删除最外面的一对花括号?

答案1

由于 Detex 显然无法做到这一点,因此我们采用另一种方法——在你的数据副本上进行测试

sed 's/^\([^{]*\){\(.*\)}\([^}]*\)$/\1\2\3/' copy_of_my.bib > another_copy_of_my.bib

这将使用 Unix/GNU/Linux 等sed工具来匹配由以下内容组成的整行(^匹配开始和$结束):

  • 一组 0 个或多个除左花括号 -- [^{]*-- 之外的字符(其中\(...\)将匹配的文本保存为 以供以后使用\1),后跟:
  • 一个左花括号,后跟:
  • 一组 0 个或多个非右花括号字符 -- -- 也由...[^}]捕获。接下来是:\(\)\2
  • 然后是一个右花括号
  • 一组 0 个或多个除右花括号 -- 之外的字符[^}]*,捕获为\3和行尾(因为$)。

这意味着 3 个捕获组\1\2\3包含一行中除最外层匹配的花括号对之外的所有内容。因此,诸如 之类的构造title = {{CamelCase} Title},将保留为title = {CamelCase} Title,。这要归功于贪婪匹配。该@article{key,}行匹配失败,因为它中没有右花括号,并且未更改地传递到输出。如果您想删除{\dq}源数据中的这种构造和 s(问题文本中未提及),我建议编写更多 sed 脚本——detex 不了解 bibtex。另一种方法是使用管道每行通过 detex 从上面的脚本中提取 sed 的输出。

如果省略输出>到屏幕之后的所有内容——这只是标准重定向。输入用于copy_of_my.bib测试。

在我的测试中,即使你}在记录的最后一行有结束符,这似乎也可以正常工作,但我不推荐这样做 -先测试一下如果你的文件结构是那样的话。它也能很好地缩进。

注意:使用略有不同的语法(例如,sed在大多数正则表达式引擎中,您不需要在 a或\之前使用 a)。Windows 上有用于命令行正则表达式的工具(如果没有其他工具,我很确定cygwin 中内置了这些工具)。()sed

还要注意,在编程中使用正则表达式匹配括号通常被认为是馊主意;我们只能在这里解决这个问题(只是)因为 bibtex 对其行结构非常严格。

最后不要将输出写在输入上除非/直到你对它的工作原理有信心。

相关内容