2014-10-02 2 views
3

Ищу команду в sed, который преобразует этот входной поток:Разбор скобкой с СЭД, используя регулярное выражение

dummy 
(key1) 
(key2)dummy(key3) 
dummy(key4)dummy 
dummy(key5)dummy))))dummy 
dummy(key6)dummy))(key7)dummy)))) 

в этот один:

key1 
key2 
key3 
key4 
key5 
key6 
key7 

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

Я провел много тестов с помощью sed с использованием регулярного выражения, но не могу найти , как решить эту проблему. Хотя я уверен, что это возможно. (Я открыт для альтернативных инструментов, таких как Perl или Python, например)

EDIT: Строка между скобками (key1, key2 .. key7) может быть любой строкой без круглых скобок.

+0

'вход для кошки | perl -nle'print $ 1 if/(key \ d +)/'Вы должны отправить код, который вы пробовали, когда задаете вопросы! – chilemagic

ответ

1

вы можете использовать этот г на основе просмотра назад egex в grep -oP:

grep -oP '(?<=\()[^)]+' file 
key1 
key2 
key3 
key4 
key5 
key6 
key7 

Или с помощью awk:

awk -F '[()]' 'NF>1{for(i=2; i<=NF; i+=2) if ($i) print $i}' file 
key1 
key2 
key3 
key4 
key5 
key6 
key7 
+1

Спасибо. Я выбираю ваше решение. Он работает с довольно общими строками.На самом деле, я попробовал этот файл, и он прошел через: duxxmmy (test1) (k./\ey2)du./\mmy(ke3zb\.\/ouby3) дю \/\ ddmmy (key44.. \/\ 44) dum \/\/ffmy duddmmy (key55 _ [] -_ 55_5) dumppmy)))) duaaammy dumrrmy (6key -_ []. \ /. 6) drrummy)) (key7) dddummy)))) – vinzvanilla

+0

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

+1

Просто сделал. Благодаря ! – vinzvanilla

2

Perlishly Я хотел бы сделать:

my @all_keys; 

while (<DATA>) { 
    push (@all_keys, m/\((.+?)\)/g ); 
} 
print join ("\n",@all_keys); 


__DATA__ 
dummy 
(key1) 
(key2)dummy(key3) 
dummy(key4)dummy 
dummy(key5)dummy))))dummy 
dummy(key6)dummy))(key7)dummy)))) 

Это предполагает, что матч 'ключи' \w в perlre (буквенно-цифровой плюс "_",)

(Если вы не знакомы с Perl, вы можете в значительной степени просто поменять места, что <DATA> для <STDIN> и труб в данных прямо в ваш сценарий - или делать более интересные вещи с @all_keys)

+0

Я пробовал это решение. Действительно, он работает с алфавитно-цифровыми строками, но строка ключей может быть любой строкой без круглых скобок, и в моем случае я буду использовать ее для имени файла с путями, то есть он может иметь специальные символы, такие как/\. [] - _ Спасибо за ваше время в любом случае, я создал свой первый скрипт perl ;-) – vinzvanilla

+0

Вы можете сделать более широкое совпадение с 'm /\((.+?)\)/ g' -' .' обозначает любой тип символа, но минимальное совпадение с '?'. Просто следите за именами файлов в скобках. – Sobrique

+0

(Ответ исправлен соответственно - он теперь работает с вашими данными выборки?) – Sobrique

1

В Perl можно использовать Marpa, общий BNF анализатор - код анализатор в this gist.

Анализатор BNF, возможно, более обслуживается, чем регулярное выражение. Parens вокруг символов грамматики скрывают свои значения от дерева синтаксического анализа, что упрощает последующую обработку.

Надеюсь, это поможет.

+0

Спасибо, я посмотрю. – vinzvanilla

+0

Отлично, BTW, только что протестированный duxxmmy (test1) (k./\ey2)du./\mmy(ke3zb\.\/ouby3) du. \/\ Ddmmy (key44. \/\ 44) dum \/\/ffmy duddmmy (key55 _ [] -_ 55_5) dumpmy)))) duaaammy dumrrmy (6key -_ []. \ /. 6) drrummy)) (key7) dddummy)))) output is test1 k./\ey2 ke3zb \. \/ouby3 ключ44. \/\ 44 ключ55 _ [] -_ 55_5 6key -_ []. \ /. 6 ключ7 – rns

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