简体   繁体   English

通过Bash脚本捕获文本组

[英]Capture groups of text via a Bash script

A file that looks like the following is created from an API call. 通过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" ]
}

How can I capture each traces separately? 如何分别捕获每条迹线? I will need to iterate through them in a subsequent step. 在接下来的步骤中,我将需要遍历它们。

The following doesn't return anything unless I remove the parentheses. 除非删除括号,否则以下内容不会返回任何内容。 Then it just gives the entire "traces" line. 然后,它仅给出整个“迹线”行。

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

The answer must be able to run on all Unix machines without loading libraries. 答案必须能够在所有Unix机器上运行而无需加载库。

You can use: 您可以使用:

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

Options: 选项:

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

Output: 输出:

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 正则表达式演示和说明

Use grep -oE : 使用grep -oE

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

Output: 输出:

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

You could also stay in bash: 您还可以继续使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM