2017-04-20 116 views
2

從API調用創建如下所示的文件。通過Bash腳本捕獲文本組

{ 
    "success" : true, 
    "messages" : [ "traces loaded successfully" ], 
    "traces" : [ "CRXJ-ZCKP-3XVD-4J36", "8C31-QMHZ-XVF0-ZV4Q", "40P7-MT6L-2YFP-5Q6Q", "JE7J-J4WQ-7GGL-2U8N", "10PW-AZ8M-FPTK-XWYL", "9YGF-5HOP-8GTY-9AF4", "SNXZ-GW6O-BTJT-3XUX" ] 
} 

如何分別捕獲每條曲線? 我將需要在後續步驟中遍歷它們。

以下不會返回任何東西,除非我刪除括號。然後它只是給出整個「痕跡」線。

grep "([A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4})" 

答案一定是能夠在不加載庫在所有的UNIX機器上運行。

+0

您可以嘗試-o選項。 – Shiping

+0

爲什麼你想用'grep'解析'JSON'文本,而不是像'jq'這樣的語法感知工具? – Inian

+0

@Inian,這個腳本必須能夠在所有Unix機器上運行而不需要加載庫。 – citizen

回答

2

您可以使用:

grep -oE '([A-Z0-9]+-?){4}' file 

選項:

-o, --only-matching  show only the part of a line matching PATTERN 
-E, --extended-regexp  PATTERN is an extended regular expression (ERE) 

輸出:

CRXJ-ZCKP-3XVD-4J36 
8C31-QMHZ-XVF0-ZV4Q 
40P7-MT6L-2YFP-5Q6Q 
JE7J-J4WQ-7GGL-2U8N 
10PW-AZ8M-FPTK-XWYL 
9YGF-5HOP-8GTY-9AF4 
SNXZ-GW6O-BTJT-3XUX 

Regex Demo and Explanation

1

使用grep -oE

grep -oE '[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}' file 

輸出:

CRXJ-ZCKP-3XVD-4J36 
8C31-QMHZ-XVF0-ZV4Q 
40P7-MT6L-2YFP-5Q6Q 
JE7J-J4WQ-7GGL-2U8N 
10PW-AZ8M-FPTK-XWYL 
9YGF-5HOP-8GTY-9AF4 
SNXZ-GW6O-BTJT-3XUX 
0

你也可以留在bash:

#!/usr/bin/env bash 

regex='("(([[:alnum:]]{4}-?){4})"(,)?)+' 

while read -r line 
do 
    if [[ "$line" =~ $regex ]] 
    then 
     for trace in ${BASH_REMATCH[0]//[\",]/} 
     do 
      echo "do stuff with $trace" 
     done 
    fi 
done<input_file