2017-04-20 119 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