2012-11-05 28 views
8

I następujący tekstwyodrębnić wiele zrobione z grupy sed zmiennych

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

gdzie abc jest zastępczy dobrze określonej ekspresji. Chciałbym wyodrębnić 3 terminy w nawiasach i zapisać je w 3 oddzielnych zmiennych. Czy można to zrobić bez trzykrotnego analizowania tekstu? Zasadniczo chciałbym uchwycić i w jakiś sposób "wyeksportować" wiele grup.

To jasne, że można wyodrębnić z nich tak:

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

Ale czy to możliwe, aby wszystkie 3 z nich bez uruchamiania sed 3 razy?

Inne rozwiązania (przenośne) bez sed są również mile widziane.

Odpowiedz

10

Jeśli są jakieś znaki, które znasz niepojawiają się THIS, THAT lub WHAT, to można napisać coś takiego:

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

informujący sed używać tego separatora na jego wyjściu, i read, aby użyć tego separatora w danych wejściowych.

5

To może pracować dla Ciebie (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

Jaka jest nazwa '$ (foo)' operator? Czy to jest podobne do '\' foo \ ''? – Jawap

+0

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

2

Nie potrzeba do tarła proces:

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"