从SED到变量提取多个捕获的组



我有以下文本

abc <THIS> abc <THAT> abc <WHAT> abc

abc是一个定义良好表达式的占位符。我想在括号中提取3个术语,然后将它们保存在3个单独的变量中。可以在不解析文本3次的情况下做到这一点吗?基本上我想捕获并以某种方式"导出"多个组。

很明显,我可以这样提取其中一个:

VARIABLE=`echo $TEXT | sed "s_abc <(.*)> abc <.*> abc <.*> abc_1_g"`

但是可以在不运行sed 3次的情况下获得所有3次吗?

也欢迎其他没有sed的(便携式)解决方案。

如果您知道有任何字符出现在THISTHATWHAT中,那么您可以写下类似的内容:

IFS=$'t' read -r VAR1 VAR2 VAR3 
    < <(sed 's/^abc <(.*)> abc <(.*)> abc <(.*)> abc$/1t2t3/' 
             <<< "$TEXT"
       )

告诉 sed在其输出中使用该分离器,而read在其输入中使用该分离器。

这可能对您有用(gnu sed&amp; bash):

line='abc <THIS> abc <THAT> abc <WHAT> abc'
var=($(sed 's/[^<]*<([^>]*)>[^<]*/"1" /g' <<<"$line"))
echo "first ${var[0]} second ${var[1]} third ${var[2]}"
first "THIS" second "THAT" third "WHAT"

无需产生一个过程:

var='abc <THIS> abc <THAT> abc <WHAT> abc'
var1=${var#abc <}          # Remove the leading 'abc <'.
THIS="${var1%%> abc <*}"   # Remove the longest trailing '> abc <*'.
var2="${var1#*> abc <}"    # Remove the shortest leading '*> abc <'.
THAT="${var2%%> abc <*}"   # Remove the longest trailing '> abc <*'.
var3="${var2#*> abc <}"    # Remove the shortest leading '*> abc <'.
WHAT="${var3%> abc}"       # Remove the trailing '> abc'
echo "$THIS"
echo "$THAT"
echo "$WHAT"

相关内容

  • 没有找到相关文章

最新更新