使用 Bibtool 的 select.non.string 规则过滤书目条目

使用 Bibtool 的 select.non.string 规则过滤书目条目

我正在尝试使用 Bibtool 根据某些字段标准从参考书目中排除(过滤掉)一系列条目。

Bibtool 提供了一条select.by.non.string规则,如果书目条目在其某个字段中包含某个字符串,则会将其排除。

例如,对于具有以下条目的给定 bib 文件:

@misc{foo19,
  author = {Foo, John},
  title = {Travel Diary},
  year = {2019},
  publisher = {Bar Publishing}
}

@misc{smith20,
  author = {Smith, Mary},
  title = {New Years Resolutions},
  year = {2020}
  publisher = {Bar Publishing}
}

@misc{foo20,
  author = {Foo, John},
  title = {Isolation},
  year = {2020}
  publisher = {Pandemic Press}
}

并使用以下资源文件调用 bibtool:

select.by.string.ignored {"{}"}
select.case.sensitive {off}
select.by.non.string { title "Travel Diary" }

将导致输出不包括任何标题为“旅行日记”的条目,在这种情况下,结果书目为:

@misc{smith20,
  author = {Smith, Mary},
  title = {New Years Resolutions},
  year = {2020}
  publisher = {Bar Publishing}
}

@misc{foo20,
  author = {Foo, John},
  title = {Isolation},
  year = {2020}
  publisher = {Pandemic Press}
}

到目前为止,一切都很好。但是,一旦资源文件中包含多个这样的规则,这种行为就会出现问题。在当前 Bibtool 手册的第 34 页(第 A.9.2 节)中,它指出

如果提供了多条规则,则选择符合其中一条规则的任何条目。因此,不同的规则可作为备选方案。

我期望的是,首先匹配的规则适用于该给定条目,但事实并非如此。如果将第二条规则添加到资源文件中,如下所示:

select.by.string.ignored {"{}"}
select.case.sensitive {off}
select.by.non.string { title "Travel Diary" }
select.by.non.string { title "Isolation" }

它不会过滤掉包含“旅行日记”和“隔离”标题的条目,而是完全不过滤掉任何书目条目;完整的原始输入书目会返回,并且不会出现任何 Bibtool 错误。

此外,即使在单个select.by.non.string规则内指定多个字段,我也会得到相同的结果。

我只想根据一系列标准排除各种条目,这应该是一个相当简单的练习。这是错误的规则/工具吗?我做错了吗?其他人如何在不诉诸剪切和粘贴的情况下完成此任务?

答案1

您可以使用正则表达式来实现这一点。与字符串选项类似,可以select包含与正则表达式匹配的条目,也select.non可以排除与表达式匹配的条目。

在正则表达式中,竖线|用作“或”运算符。在 Bibtool 中,此字符需要用反斜杠转义,如手动的在第32页。

资源文件:

select.by.string.ignored {"{}"}
select.case.sensitive {off}
select.non { title "Travel Diary\|Isolation" }

相关内容