如何读取parantheses之间的数据提取并将其打印到另一个文件

时间:2017-07-11 10:28:15

标签: regex bash perl awk sed

我正在寻找一种从多个括号中提取特定文本并希望存储在文件中的方法。内容看起来像这样。

{& Vendor CGIO} 1100 650} {{& IP_OWNER cjohn} 1100 550} {{& Product pk_sgmii_serdes_sx_ico_idac_sw_by2} 1100 450} {{& DATE_TIME Aug 29 03:27:36 2016} 1100 750} {{& Version 1.1} 1100 350} {{& PDK_RELEASE_VERSION V1} 1100 850}

我想提取以下内容并将其打印到文件中。

& Vendor CGIO
& IP_OWNER cjohn
& Product pk_sgmii_serdes_sx_ico_idac_sw_by2
& Version 1.1

我尝试使用cut命令,但提取所有变量并不是那么有用。

cat Tags_file | cut -d '{' -f2 | cut -d '}' -f1

4 个答案:

答案 0 :(得分:3)

grep -oP '(?<={)[^{}]+(?=})' file & Vendor CGIO & IP_OWNER cjohn & Product pk_sgmii_serdes_sx_ico_idac_sw_by2 & DATE_TIME Aug 29 03:27:36 2016 & Version 1.1 & PDK_RELEASE_VERSION V1 与基于外观的正则表达式一起使用:

#wrapper{
    display: flex;
    justify-content: space-between;
    border: 2px dotted red;
    padding: 20px;
}
#wrapper div{
    width: 48%;
    border: 2px dotted purple;

}

答案 1 :(得分:1)

也许while循环也会打印输出:

my $str = '{& Vendor CGIO} 1100 650} {{& IP_OWNER cjohn} 1100 550} {{& Product pk_sgmii_serdes_sx_ico_idac_sw_by2} 1100 450} {{& DATE_TIME Aug 29 03:27:36 2016} 1100 750} {{& Version 1.1} 1100 350} {{& PDK_RELEASE_VERSION V1} 1100 850}';

print "$1\n" while($str=~m/\{([^\{\}]*)\}/g);

答案 2 :(得分:1)

尝试

grep -Poh '(?<={)& (?!DATE|PDK)[^}]+' Tags_file 

我得到了什么:

& Vendor CGIO
& IP_OWNER cjohn
& Product pk_sgmii_serdes_sx_ico_idac_sw_by2
& Version 1.1

正是您所需要的。 (在您的示例中排除了DATE_TIMEPDK

Regex101 demo

答案 3 :(得分:1)

首先,将所有{&更改为newlines,然后删除剩余的噪音(请注意我也删除了初始&):

$ echo "{& Vendor CGIO} 1100 650} {{& IP_OWNER cjohn} 1100 550} {{& Product pk_sgmii_serdes_sx_ico_idac_sw_by2} 1100 450} {{& DATE_TIME Aug 29 03:27:36 2016} 1100 750} {{& Version 1.1} 1100 350} {{& PDK_RELEASE_VERSION V1} 1100 850}" 
| sed 's/{&/\n/g' | awk -F\} '{ print $1 }'

 Vendor CGIO
 IP_OWNER cjohn
 Product pk_sgmii_serdes_sx_ico_idac_sw_by2
 DATE_TIME Aug 29 03:27:36 2016
 Version 1.1
 PDK_RELEASE_VERSION V1