Регулярное выражение для sed немного сбивает с толку, но работоспособное
sed '
:a #mark return point
s/\(\(^\|)\)[^(]\+\);\s*\([^)]\+\((\|$\)\)/\1\n\3/ #remove ; between ) and (
ta #repeat if substitute success
s/[[:blank:];]\+$// #remove ; with spaces at end
'
объяснение регулярного выражения Breif:
^ \ |)
от начала строки или )
[^ (] \ +
любые символы, кроме (
; \ s *
точка с запятой с возможными пробелами (\ | $
до конца строки или (