1

このような複数の 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}
}

1 行または複数行 (上記の場合のように) にまたがる抽象フィールドを消去したいと考えています。次の方法でsedを使用してみました

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

file は、上記の bibtex コードを含むテキスト ファイルです。ただし、このコマンドの出力は

@article{Lindgren1989Resonant,

明らかに sed は最後の } に一致しますが、抽象値の閉じ括弧に一致させるにはどうすればよいですか?

4

3 に答える 3

2

これはあなたのために働くかもしれません:

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

これにより、ファイル全体が保留スペースに丸呑みされ、abstractフィールドが削除されます

説明:

最初の行で、ホールド スペース (HS) を現在の行に置き換え、後続のすべての行を HS に追加します。最後の行に遭遇したら、HS にスワップし、abstract フィールドのすべてのオカレンスを置き換えてから、ファイルを出力します。NB 通常は印刷されるすべての行が削除されます。

于 2011-11-16T15:39:20.490 に答える
1

sed のアドレスは奇妙な方法で一致します。

addr2 は、式で経験しているものである addr1 の前に一致する可能性があります! 複数のブロックを使用します。

于 2011-11-16T15:36:51.363 に答える
1

このawk行はあなたのために働きますか?

 awk '/abstract *= *{/{a=1} (a && /} *,$/){a=0;next;}!a' yourInput
于 2011-11-16T15:31:07.280 に答える