помочь с регулярным выражением - извлечение текста - PullRequest
2 голосов
/ 02 марта 2011

Предположим, у меня есть несколько текстовых файлов (f1.txt, f2.txt, ...), которые выглядят примерно так:

@article {paper1,
author = {some author},
title = {some {T}itle} ,
journal = {journal},
volume = {16},
number = {4},
publisher = {John Wiley & Sons, Ltd.},
issn = {some number},
url = {some url},
doi = {some number},
pages = {1},
year = {1997},
}

Я хочу извлечь содержимое заголовка и сохранить его в переменной bash(назовите это $ title), то есть "some {T} itle" в примере.Обратите внимание, что в первом наборе фигурных скобок могут быть фигурные скобки.Кроме того, вокруг «=» может не быть пробелов, а перед «заголовком» может быть больше пробелов.

Большое спасибо.Мне просто нужен рабочий пример того, как извлечь это, и я могу извлечь другие вещи.

Ответы [ 3 ]

4 голосов
/ 02 марта 2011

Попробуйте:

title=$(sed -n '/^[[:blank:]]*title[[:blank:]]*=[[:blank:]]*{/ {s///; s/}[^}]*$//p}' inputfile)

Пояснение:

  • /^[[:blank:]]*title[[:blank:]]*=[[:blank:]]*{/ { - Если строка соответствует этому регулярному выражению
    • s/// - удалить соответствующую часть
    • s/}[^}]*$//p - удалить последнюю закрывающую фигурную скобку и каждый символ, который не является закрывающей фигурной скобкой, до конца строки и вывести
  • } - заканчивается, если
2 голосов
/ 02 марта 2011
title=$(sed -n '/title *=/{s/^[^{]*{\([^,]*\),.*$/\1/;s/} *$//p}' ./f1.txt)
  1. /title *=/: действовать только на те строки, которые имеют слово 'title', за которым следует '=' после произвольного числа пробелов
  2. s/^[^{]*{\([^,]*\),.*$/\1/: с началастрока ищет первый символ «{».С этого момента сохраняйте все, что найдете, пока не нажмете запятую ','.Замените всю строку на все, что вы сохранили
  3. s/} *$//p: удалите завершающую скобку '}' вместе с любыми пробелами и напечатайте результат.
  4. title=$(sed -n ... ): сохраните результатвыше 3 шага в переменной bash с именем title
0 голосов
/ 02 марта 2011

Есть определенно более элегантные способы, но в 2:40 AM:

title=`cat test | grep "^\s*title\s*=\s*" | sed 's/^\s*title\s*=\s*{?//' | sed 's/}?\s*,\s*$//'`

Grep для линии, которая нас интересует, зачистить все до и включая вьющееся отверстие, затем зачистить все от последнего вьющегося до конца линии

...