2013-04-05 6 views
0

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

Original File

AAA 
{  
    "(BBB|KKK)" 
    { 
    B_1 abc; 
    B_2 bcd; 
    B_3 efg; 
    B_4 xyz; 
    } 

    CCC 
    { 
    C_1 cbc; 
    C_2 dcd; 
    } 
} 

DDD 
{ 

    EEE 
    { 
    E_1 ebc; 
    E_2 fcd; 
    } 

    "(FFF|LLL|MMM|NNN)" 
    { 
    F_1 gbc; 
    F_2 hcd; 
    } 
} 

GGG 
{ 
    G_1 ibc; 
} 

HHH 
{ 
    III 
    { 
    JJJ 
    { 
     J_1 jbc; 
     J_2 kbc; 
    } 
    } 
} 

Я хочу с помощью AWK или некоторые инструменты, чтобы получить результат, как (просто взять пример)

F_1 = gbc 
G_1 = ibc 
J_1 = jbc 

Мой вопрос заключается в следующем: как определить шаблон регулярного выражения, чтобы совместить, во-первых, искать ключевое слово FFF, затем выводить содержимое, находящееся между ближайшими браслетами { и }?

F_1 gbc; 
F_2 hcd; 

И тогда это содержимое может быть дополнительно конвейеру и с помощью grep я могу получить значение gbc для элемента F_1.

Кто-нибудь знает, как это сделать?

+0

Что произойдет с ключевым словом «DDD»? – Scrutinizer

+0

Да, действительно есть несколько сведений о первом и третьем уровне, которые мне тоже нужны. См. Мой отредактированный пост. – Daniel

+2

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

ответ

1

Это позволит вам «определить шаблон регулярного выражения так, чтобы соответствовать, во-первых, говорят, поиск ключевое слово FFF , а затем выводить содержимое, которые между ближайшими браслетами и {} ":

$ gawk -v RS='\0' '{ print gensub(/.*\yFFF\y[^{]+{[[:space:]]*\n([^}]+)\n[[:space:]]*}.*/,"\\1","") }' file 
    F_1 gbc; 
    F_2 hcd; 

ли не Направьте вывод Grep. Независимо от того, что вы хотите, можно легко сделать в рамках одного вызова awk.

+0

WOW, сейчас это невозможно. Спасибо, в любом случае! Я пишу программу с C++ прямо сейчас, что намного легче для меня справиться с этой ситуацией. Кроме того, в моем файле, как вы можете видеть по ссылке, приведенной в этом сообщении, много повторений ключевого слова 'U', а не простого ключевого слова' FFF'. – Daniel

1

Вот скрипт, который должен быть хорошо только для данных вложенных групп второго уровня:

$ awk -v var="FFF" '$1=="}"{p=0}p{sub(/^ */,"");print};$1==var{p=1;getline}' file 
F_1 gbc; 
F_2 hcd; 
+0

Спасибо, но нет ли чистого решения? :) – Daniel

+2

@ Daniel «Чистым» решением является использование/запись правильного парсера для формата файла fvSolution OpenFOAM. –

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