Использование sed для стирания поля в записи bibtex - PullRequest
1 голос
/ 16 ноября 2011

Я столкнулся с текстовым файлом, содержащим несколько экземпляров 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

где файл - текстовый файл, содержащий указанный выше код bibtex. Тем не менее, вывод этой команды просто

@article{Lindgren1989Resonant,

Очевидно, что sed соответствует финалу}, но как мне получить его, чтобы он соответствовал закрывающей скобке абстрактного значения?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Это может работать для вас:

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

Это сбрасывает весь файл в область удержания, а затем удаляет поля abstract

Пояснение:

В первой строке замените область удержания (HS) текущей строкой, добавьте все последующие строки в HS. Встретив последнюю строку, переключитесь на HS и замените все вхождения абстрактного поля, а затем распечатайте файл. Нотабене все строки, которые обычно выводятся на печать, удаляются.

1 голос
/ 16 ноября 2011

Адреса в sed совпадают странным образом:

addr2 может соответствовать ДО addr1, что вы испытываете с вашим выражением!Используйте несколько блоков.

1 голос
/ 16 ноября 2011

эта линия awk работает для вас?

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