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

时间:2012-11-05 16:46:30

标签: macos bash shell unix sed

我有以下文字

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

其中abc是一个定义良好的表达式的占位符。我想在括号中提取3个术语并将它们保存在3个单独的变量中。没有解析文本3次就可以做到这一点吗?基本上我想捕捉并以某种方式“导出”多个群组。

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

VARIABLE=`echo $TEXT | sed "s_abc <\(.*\)> abc <.*> abc <.*> abc_\1_g"`

但是有可能让所有3个没有运行sed 3次吗?

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

3 个答案:

答案 0 :(得分:10)

如果您知道的任何字符 <{1}},THISTHAT,那么您可以写下这样的内容:< / p>

WHAT

告诉IFS=$'\t' read -r VAR1 VAR2 VAR3 \ < <(sed 's/^abc <\(.*\)> abc <\(.*\)> abc <\(.*\)> abc$/\1\t\2\t\3/' \ <<< "$TEXT" ) 在其输出中使用该分隔符,并sed在其输入中使用该分隔符。

答案 1 :(得分:5)

这可能适合你(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"

答案 2 :(得分:2)

无需生成进程:

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"