我有一个 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 对其行结构非常严格。
最后不要将输出写在输入上除非/直到你对它的工作原理有信心。