10

私は次のテキストを持っています

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

ここで、abcは明確に定義された式のプ​​レースホルダーです。括弧内の3つの用語を抽出し、それらを3つの別々の変数に保存したいと思います。テキストを3回解析せずにそれを行うことは可能ですか?基本的に、複数のグループをキャプチャして、どういうわけか「エクスポート」したいと思います。

次のようにそのうちの1つを抽出できることは明らかです。

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

しかし、sed3回実行せずに3つすべてを取得することは可能ですか?

なしの他の(ポータブル)ソリューションsedも歓迎します。

4

3 に答える 3

11

、、またはに表示されないことがわかっている文字がある場合は、次のように記述できます。THISTHATWHAT

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

sedそのセパレーターを出力で使用し、そのセパレーターを入力で使用するように指示しreadます。

于 2012-11-05T16:56:45.127 に答える
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"
于 2012-11-05T17:06:02.597 に答える
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"
于 2012-11-05T20:27:15.703 に答える