Первая часть вашего регулярного выражения - это положительный вид переменной ширины:
(?<=
TOPIC \s*\('|
QLOCAL\s*\('|
QALIAS\s*\('|
SUB \s*\('
)
Рекомендуется объединить буквенные слова в свою собственную группу альтернатив и использовать оператор \K
, который отбрасывает текст, сопоставленный так далеко от текущего буфера памяти: (?:TOPIC|QLOCAL|QALIAS|SUB)\s*\('\K
.
Остальное можно использовать как есть с -oP
опциями и GNU grep
:
grep -oP "(?:TOPIC|QLOCAL|QALIAS|SUB)\s*\('\K.*?(?='\))" file
См. Демоверсию regex и online grep
demo :
s="DEFINE QLOCAL ('IIB.TESTQUEUE.MODULE') +
DESCR('Input queue for A to B') +
LIKE('MY.LOCALQ.TEMP') +
REPLACE"
grep -oP "(?:TOPIC|QLOCAL|QALIAS|SUB)\s*\('\K.*?(?='\))" <<< "$s"
# => IIB.TESTQUEUE.MODULE