2015-02-27 3 views
1

Я рассмотрел несколько ответов, связанных с этим вопросом, однако, я все еще не могу получить то, что мне нужно для работы.Извлечение текста между двумя терминами

По существу, я пишу бумагу, которая использует библиографические коды в контейнере разметки. Это может происходить несколькими способами, например .:

\citet{bibcode} 
\citep{bibcode} 
\citet{bibcode1,bibcode2} 
\citep[randomtext]{bibcode} 

т.д.

Я пытаюсь составить список чисто этих bibcodes. Если в одном контейнере имеется несколько бибкодов, они разделяются запятой.

В настоящее время я использую:

sed -n 's:.*\cite.*{\(.*\)}.*:\1:p' sample.tex 

Это работает для некоторых случаях, однако, не со всеми. Похоже, что он все еще отвлекается от других применений фигурных скобок и поднимает много ненужного текста.

Любая помощь по этому вопросу была бы высоко оценена.

Заранее спасибо.

+2

Вы можете дать еще несколько образцов (где он не работает ...) Показывать исходные образцы и ожидаемый результат. Если есть другие фигурные скобки, ваша команда не будет делать то, что вам нужно. –

ответ

1

Если предположить, что это не более, чем одна цитата на каждой строке, вы можете настроить регулярное выражение, чтобы быть что-то вроде этого:

s:.*\\cite[^{]*{\([^}]*\)}.*:\1:p 
+0

Большое спасибо, Balthamos. В вашем обновленном регулярном выражении опущены те экземпляры, где был добавлен дополнительный текст. Однако он не собирает все экземпляры команды \ cite {}, даже те, у которых есть только один bibcode, расположенный между фигурными скобками. Любые идеи, почему это может произойти? – user1886912

+0

Не могли бы вы привести пример строки, которая терпит неудачу? Я тестировал его с помощью '\ cite {foobar}', и он, похоже, работал. Как я уже говорил, если у вас есть более одного '\ cite' за строку, он будет только получать первый экземпляр. – Balthamos

0

Это будет работать для ввода образца вы дали:

$ cat tst.awk 
BEGIN { FS="[{},]" } 
/\\cite/ { 
    for (i=2;i<NF;i++) { 
     if (!seen[$i]++) { 
      print $i 
     } 
    } 
} 

$ awk -f tst.awk file 
bibcode 
bibcode1 
bibcode2 

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

Смежные вопросы