2012-11-05 60 views
8

我有以下文本提取多個捕獲基團從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的歡迎。

回答

10

如果有,你知道會不會出現在THISTHAT,或WHAT,那麼你可以寫這樣的事情的任何字符:

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

告訴sed使用該分離器,它的輸出,和read在其輸入中使用該分隔符。

5

這可能爲你工作(GNU sed的&的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" 
+0

有什麼'$的(富)'運營商的名字嗎?這與'\'foo \''類似嗎? – Jawap

+0

@Jawap見[這裏](http://mywiki.wooledge.org/BashFAQ/082)。 – potong

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"