通过Bash脚本捕获文本组

时间:2017-04-20 22:37:24

标签: regex bash grep

通过API调用创建如下所示的文件。

{
  "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机器上运行而无需加载库。

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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