如何使用sed或awk或bash从两个定界符字符串中提取字符串?

时间:2019-04-29 21:09:19

标签: regex bash awk sed

我不经常使用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中时,此操作不会打印任何内容。

awk/sed/grep to extract the desired string

4 个答案:

答案 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 demoonline 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