【问题标题】:Using sed to erase field in bibtex entry使用 sed 擦除 bibtex 条目中的字段
【发布时间】:2011-12-30 12:59:57
【问题描述】:

我面临一个包含多个像这样的 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 与最后的 } 匹配,但我如何让它匹配抽象值的右括号?

【问题讨论】:

    标签: regex sed bibtex


    【解决方案1】:

    这可能对你有用:

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

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

    解释:

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

    【讨论】:

    • 差不多。它在此处的第一行末尾保留 }。
    • 嗯,那个版本在我看来根本不起作用。这是我从您之前的回答pastebin.com/J3yfCcmq 中得到的信息。请注意第一行的末尾如何有一个额外的“}”,它不应该在那里。顺便说一句,感谢您的努力。我很乐意帮助您解决这个问题,但我不知道您的代码实际上在做什么。
    • 您的数据似乎可以有一个或多个关闭}。解决方案已修改。
    • 最后,您发布的代码并未触及抽象字段。似乎右括号 (}+) 上的 + 号似乎破坏了一些东西。另外,我认为如果抽象文本本身包含大括号,则此代码将失败,不幸的是,这可能会发生。
    • 对不起,我做了正确的哈希并忘记转义 + 符号。再试一次!
    【解决方案2】:

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

    addr2 可以在 addr1 之前匹配,这就是您在表达时遇到的情况!使用多个块。

    【讨论】:

      【解决方案3】:

      这条 awk 线对你有用吗?

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

      【讨论】:

        猜你喜欢
        • 2014-10-22
        • 2020-11-04
        • 1970-01-01
        • 2011-04-03
        • 2021-07-09
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多