Есть фраза, которую следует запомнить: "Регулярные выражения не умеют считать".
В данном случае это имеет значение, потому что многие "простые" инструменты 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.