Я использовал файл сценария sed (называемый sedscript
), содержащий:
/^[^(]*([^)]*$/N
s/^[^(]*(\([^)]*\)).*/\1/p
и командная строка:
sed -n -f sedscript data
С учетом ввода:
(123)
aa (a(b)cd)) (g) (c)fff
abcd(aabb
d)aa (aeb)oe
Получено:
123
a(b
aabb
d
Вы можете сделать это в одной командной строке с помощью:
sed -n -e '/^[^(]*([^)]*$/N' -e 's/^[^(]*(\([^)]*\)).*/\1/p' data
Первый шаблон ищет строки, содержащие открытую скобку без закрывающей скобки после нее, читает следующую строку в память и начинает заново. Это повторяется до тех пор, пока в данных не будет закрытой скобки (или EOF). Второй шаблон ищет вещи перед открывающей скобкой, открытые скобки, запоминает данные оттуда до первой закрывающей скобки, за которой следуют закрывающая скобка и любые другие вещи; он заменяет это запомненной строкой и печатает ее. Все остальное не напечатано (-n
).