2012-11-05 20 views
8

Tôi đã văn bảnExtract nhiều bắt nhóm từ sed để biến

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

nơi abc là một giữ chỗ cho một biểu thức được xác định rõ sau. Tôi muốn trích xuất 3 từ trong dấu ngoặc và lưu chúng trong 3 biến riêng biệt. Có thể làm điều đó mà không phân tích cú pháp văn bản 3 lần không? Về cơ bản tôi muốn nắm bắt và bằng cách nào đó "xuất khẩu" nhiều nhóm.

Rõ ràng là tôi có thể trích xuất một trong số họ như thế này:

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

Nhưng là nó có thể nhận được tất cả 3 trong số họ mà không cần chạy sed 3 lần?

Các giải pháp (di động) khác mà không cần sed cũng được hoan nghênh.

Trả lời

10

Nếu có bất kỳ ký tự mà bạn biết sẽ không xuất hiện trong THIS, THAT, hoặc WHAT, sau đó bạn có thể viết một cái gì đó như thế này:

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

nói sed sử dụng tách rằng trong sản lượng của nó, và read để sử dụng dấu phân tách đó trong đầu vào của nó.

5

Điều này có thể làm việc cho bạn (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

tên của '$ (foo)' điều hành là gì? Điều đó tương tự như '\' foo \ ''? – Jawap

+0

@Jawap xem [tại đây] (http://mywiki.wooledge.org/BashFAQ/082). – potong

2

Không cần phải đẻ trứng một quá trình:

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"