2012-11-05 2 views
8

Ich habe den Text folgendeExtract mehreren erfassten Gruppen von Sed an Variablen

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

wo abc ein Platzhalter für eine gut definierte Ausdruck. Ich möchte die 3 Begriffe in den Klammern extrahieren und sie in 3 verschiedenen Variablen speichern. Ist das möglich, ohne den Text dreimal zu analysieren? Grundsätzlich möchte ich mehrere Gruppen erfassen und irgendwie "exportieren".

Es ist klar, dass ich einen von ihnen wie folgt extrahieren:

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

Aber ist es möglich, alle drei von ihnen zu erhalten, ohne sed 3-mal ausgeführt wird?

Andere (portable) Lösungen ohne sed sind ebenfalls willkommen.

Antwort

10

Wenn es irgendwelche Zeichen, die Sie wissen, wird nicht erscheinen in THIS, THAT oder WHAT, dann kann man so etwas schreiben:

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

sed sagen, dass Separator in seiner Ausgabe zu verwenden, und read, um dieses Trennzeichen in seiner Eingabe zu verwenden.

5

Dies könnte für Sie arbeiten (GNU & bash sed):

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

Was ist der Name der '$ (foo)' Operator? Ist das ähnlich wie '\' foo \ ''? – Jawap

+0

@Jawap siehe [hier] (http://mywiki.wooledge.org/BashFAQ/082). – potong

2

keine Notwendigkeit, einen Prozess zum Laichen:

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" 
Verwandte Themen