如何在 shell 脚本中替换 BibTeX 中的特殊字符(例如 {\'{o}} = ó)?

如何在 shell 脚本中替换 BibTeX 中的特殊字符(例如 {\'{o}} = ó)?

有谁知道任何实用程序或有将 BibTeX 文件中的特殊字符转换为 bash 脚本中正确的 unicode 等效字符的经验吗?问题是我什至无法在任何地方找到 BibTeX 特殊字符的完整列表。我创建了一个正则表达式的怪物,但我仍然遇到转义问题,因为 BibTeX 特殊字符(即反斜杠、引号和大括号)的特殊方式与正则表达式或 shell 代码不太兼容...

我在想也许拥有一个带有捕获组的简单正则表达式就足够了,该捕获组{\ }在 BibTeX 标记中查找模式,如果存在匹配,{\\'{o}}则可以使用某种外部字典来匹配该内容(例如)我创建的文件,将该序列映射到其正确的 unicode 字符......ó在本例中。如果无法访问特殊字符的完整列表,则很难做到这一点。它们在研究论文元数据(我正在处理的数据)中往往非常常见。

另外一个问题是不同的 BibTex 文件对于特殊字符会有不同的语法 - 名称Müller可能被编码为author = {M{\"{u}}ller}, author = {M{\"{\u}}ller}(内部大括号中额外的反斜杠),甚至author = {M\"{u}ller}(特殊字符 TeX 片段周围没有大括号)。

我有一个交互式 shell 脚本,可以让我处理我下载的研究论文、查看/跳过/忘记它们,或者输入它们的 DOI,此时 shell 脚本会根据我使用的约定检索论文的 BibTeX、重命名文件,使用 BibTex 标签数据和 DOI,然后在我完成会话后,它会将所有已处理的文件导入 Zotero,然后运行我编写的另一个脚本,为每篇已处理的论文添加 PDF 附件和 Dropbox 链接。但这些特殊字符正在破坏我的文件名和 Zotero 元数据......

长话短说- 有谁知道如何在 bash 脚本的上下文中将 BibTeX/TeX 特殊字符转换为 unicode?或者有谁知道在哪里可以找到 BibTeX 特殊字符的完整列表?

答案1

我认为 Python 比 Bash 更适合处理字符串和 Unicode。您可以在 Bash 中轻松使用它,并且使用这个简单的模板,您不需要了解 Python:

#!/usr/bin/env python3
import sys
for line in sys.stdin:
    line = line.replace(r"\'{o}",r"ó")
    line = line.replace(r'{\"{u}}',r"ü")
    line = line.replace(r'{\"{\u}}',r"ü")
    line = line.replace(r'\"{u}',r"ü")
    print(line, end='')

用法:

  • 将上述内容复制粘贴到新的文本文件中,例如convert_tex_chars.py
  • 打开终端并cd进入文本文件所在的目录
  • 使文件可执行:chmod +x convert_tex_chars.py
  • 测试:(echo "s\'{o}ng p\'{o}ng "'M{\"{u}}ller M{\"{\u}}ller M\"{u}ller' |./convert_tex_chars.py这应该显示sóng póng Müller Müller Müller
  • 在您的 BibTeX 文件上测试它:cat original_bibtex_file |./convert_tex_chars.py >new_bibtex_file

编辑 Python 文件并根据需要添加或编辑替换内容。请注意,在 Python 中,"和 的'工作方式相同,因此""如果内容包含单引号则使用,''如果内容包含双引号则使用。请注意,r每个字符串之前允许您包含反斜杠字符而不转义它(更多细节)。

如果您想要正则表达式替换,请import re作为第二行插入,然后像这样使用它:(line = re.sub(r'\\', r'\\', line)这替换\\\)。第一个参数是你的正则表达式,第二个参数是替换(反斜杠此处处理),第三个是源字符串。请参阅官方文档网络上有数百个示例

相关内容