tmux неправильно передает последовательности ctrl-shift-arrow

Есть фраза, которую следует запомнить: "Регулярные выражения не умеют считать".

В данном случае это имеет значение, потому что многие "простые" инструменты unix основаны на регулярных выражениях. Подсчет здесь заключается в подсчете открытых и закрытых круглых скобок ("round brackets"), которые могут быть использованы внутри аргументов Test_Macro.

Если вызовы Test_Macro никогда не содержат вложенных круглых скобок, то есть простой трюк. Сначала замените каждый символ ) на новую строку, и наоборот. Затем удалите все строки, не содержащие Test_Macro, и удалите все до Test_Macro. В этот момент часть обработанного файла File2.txt будет выглядеть так

Test_Macro(abc, def, " string1 string2 test string",)   "test string2 ",)    123456

Теперь нам нужно преобразовать ) обратно. На этом этапе у вас есть несколько вариантов. Я предпочитаю использовать sed, чтобы избавиться от лишних пробелов. Нам также нужно добавить обратно ) и, возможно, ;

Сложив это вместе, мы имеем

find . -type f | while read -r fn
do
   < "$fn" tr ')\n' '\n)' | sed -n 's/.*Test_Macro(/Test_Macro(/p' | \
     sed 's/) */ /g;s/$/);/'
done

Если есть вероятность, что аргументы Test_Macro включают вложенные круглые скобки, то вам нужно достать значительно больше оружия, поскольку вам нужно разобрать входные данные, а не просто сопоставить их с образцом. (Теоретически, если вы можете ограничить уровень вложенности, то вы можете использовать шаблонизацию, но на практике это очень быстро усложняется, и вам следует отказаться от такого подхода). Существуют каркасы парсеров для таких языков, как python, или вы можете создавать инструменты на основе таких инструментов, как lex.

2
05.02.2016, 19:26
0 ответов

Теги

Похожие вопросы