我不经常使用awk或sed。感谢您的协助:
我有一个bash shell变量$ VAR,其值是:
DEFINE QLOCAL ('IIB.TESTQUEUE.MODULE') +
DESCR('Input queue for A to B') +
LIKE('MY.LOCALQ.TEMP') +
REPLACE
我要提取值IIB.TESTQUEUE.MODULE
在外壳变量$ VAR中QLOCAL<0 or more spaces>('
和')
之间。
我根据其他现有问题和在线正则表达式工具对下面的正则表达式进行了构架,但是当我尝试将此正则表达式嵌入到awk或sed中时,此操作不会打印任何内容。
答案 0 :(得分:3)
记住匹配的字符串:
echo "${VAR}" | sed -n "s/.*QLOCAL *('\([^']*\)').*/\1/p"
Offtopic:shell变量使用小写字母。
编辑:按照@EdMorton的说法,删除了[]
在太空周围。
答案 1 :(得分:2)
正则表达式的第一部分是可变宽度正向后方:
(?<=
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 demo和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
答案 2 :(得分:1)
$ echo "$var" | grep -oP "QLOCAL *\('\K[^']+"
IIB.TESTQUEUE.MODULE
不确定,为什么您的作业有问题
$ val=$(echo "$var" | grep -oP "QLOCAL *\('\K[^']+")
$ echo "$val"
IIB.TESTQUEUE.MODULE
答案 3 :(得分:0)
使用简单的cut命令:
echo $VAR|cut -d' -f2