如何使用sed调整BibTeX文件中作者姓名的格式?
解决BibTeX作者姓名格式转换的Sed命令
首先,我们需要处理BibTeX文件中Author字段的姓名格式,将“名 姓”转换为“姓, 名”,同时保留分隔符and和特殊格式(比如~非断空格)。
正确的Sed命令(适用于Windows下的GNU sed.exe)
sed.exe -i.bak '/^ *Author *=/ s/\({ \|and \)\([A-Za-z.~]\+\) \([A-Za-z'-]\+\)/\1\3, \2/g' file.bib
如果想使用更易读的扩展正则表达式,可以添加-E选项:
sed.exe -i.bak -E '/^ *Author *=/ s/(\{|and )([A-Za-z.~]+) ([A-Za-z'-]+)/\1\3, \2/g' file.bib
命令解析
让我们拆解一下这个命令的各个部分:
-i.bak:直接修改原文件,并创建一个后缀为.bak的备份文件(Windows下sed的-i选项需要指定备份后缀,避免出现异常)/^ *Author *=/:仅匹配以0个或多个空格开头,接着是Author,然后是=的行(确保只处理作者字段,不会误改其他内容)- 替换规则
s/.../.../g:(\{|and ):匹配两种前缀——要么是字段开头的{,要么是分隔作者的and(注意and后面的空格)([A-Za-z.~]+):匹配作者的“名”部分,允许字母、点号和非断空格~(覆盖单个首字母如A.、带中间名的A.~G.等常见情况)([A-Za-z'-]+):匹配作者的“姓”部分,允许字母、连字符和撇号(覆盖像O'Conner、van-der-Sar这类特殊姓氏)\1\3, \2:将匹配到的内容替换为「前缀 + 姓 + 逗号空格 + 名」,完全保留原有的分隔符和格式
你之前尝试的命令问题
你的原命令有几个关键问题:
- 正则模式过于局限:你硬编码了名的格式为
[A-Za-z]\.[A-Za-z]\.,只能匹配两个首字母的情况,无法处理单个首字母(如A.)或带~的情况(如A.~G.) - 错误的量词写法:在基本正则表达式(BRE)中,
{2,}需要转义为\{2,\},否则会被当作字面量字符处理,导致姓氏匹配失败 - 不必要的大括号匹配:你在模式末尾加了
\},这意味着只有最后一个作者(后面跟着})会被匹配,中间的作者因为后面是and而无法被替换
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

