在bibtex条目中使用sed擦除字段

时间:2011-11-16 15:20:44

标签: regex sed bibtex

我面对的是一个包含多个bibtex实例的文本文件,比如这个

@article{Lindgren1989Resonant,
    abstract = {Using a simple model potential, a truncated image barrier, for the
Al(111) surface, one obtains a resonant bound surface state at an energy
that agrees surprisingly well with recent observations by inverse
photoemission.},
    author = {Lindgren and Walld\'{e}n, L.},
    citeulike-article-id = {9286612},
    citeulike-linkout-0 = {http://dx.doi.org/10.1103/PhysRevB.40.11546},
    citeulike-linkout-1 = {http://adsabs.harvard.edu/cgi-bin/nph-bib\_query?bibcode=1989PhRvB..4011546L},
    doi = {10.1103/PhysRevB.40.11546},
    journal = {Phys. Rev. B},
    keywords = {image-potential, surface-states},
    month = dec,
    pages = {11546--11548},
    posted-at = {2011-05-12 11:42:49},
    priority = {0},
    title = {Resonant bound states for simple metal surfaces},
    url = {http://dx.doi.org/10.1103/PhysRevB.40.11546},
    volume = {40},
    year = {1989}
}

我想要删除抽象字段,它可以跨越一个或多个(如上例所示)行。我尝试以下面的方式使用sed

sed "/^\s*${field}.*=/,/},?$/{
    d
}" file

其中file是包含上述bibtex代码的文本文件。但是,此命令的输出只是

@article{Lindgren1989Resonant,

显然sed匹配最终},但是如何让它与抽象值的右括号相匹配?

3 个答案:

答案 0 :(得分:2)

这可能对您有用:

sed '1{h;d};H;${x;s/\s*abstract\s*=\s*{[^}]*}\+,//g;p};d' file

这会将整个文件放入保留空间,然后删除abstract字段

说明:

在第一行用当前行替换保留空间(HS),将所有后续行追加到HS。在遇到最后一行时,交换到HS并替换所有出现的抽象字段,然后打印出文件。注:通常打印出的所有行都将被删除。

答案 1 :(得分:1)

这个awk系列适用于你吗?

 awk '/abstract *= *{/{a=1} (a && /} *,$/){a=0;next;}!a' yourInput

答案 2 :(得分:1)

以一种奇怪的方式在sed匹配中的地址:

addr2可以匹配BEFORE addr1,这是您在表达式中遇到的!使用多个块。