首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed:如何打印每一行中所有匹配的内容?

sed:如何打印每一行中所有匹配的内容?
EN

Stack Overflow用户
提问于 2019-06-12 14:17:00
回答 2查看 97关注 0票数 1

我有一个两行的字符串:

代码语言:javascript
复制
> a="Microarchitectural Data Sampling (MDS) aka CVE-2018-12126, CVE-2018-12127,CVE-2018-12130, CVE-2019-11091, publicly announced by Intel on 5/14/2019, this has high visibility and lots of public media exposure.\nMicroarchitectural Data Sampling (MDS) aka CVE-2018-12126, CVE-2018-12127,CVE-2018-12130, CVE-2019-11091, publicly announced by Intel on 5/14/2019, this has high visibility and lots of public media exposure."
> echo -e $a
Microarchitectural Data Sampling (MDS) aka CVE-2018-12126, CVE-2018-12127,CVE-2018-12130, CVE-2019-11091, publicly announced by Intel on 5/14/2019, this has high visibility and lots of public media exposure.
Microarchitectural Data Sampling (MDS) aka CVE-2018-12126, CVE-2018-12127,CVE-2018-12130, CVE-2019-11091, publicly announced by Intel on 5/14/2019, this has high visibility and lots of public media exposure.

我想打印的是:

代码语言:javascript
复制
CVE-2018-12126 CVE-2018-12127 CVE-2018-12130 CVE-2019-11091
CVE-2018-12126 CVE-2018-12127 CVE-2018-12130 CVE-2019-11091
# OR
CVE-2018-12126
CVE-2018-12127
CVE-2018-12130
CVE-2019-11091
CVE-2018-12126
CVE-2018-12127
CVE-2018-12130
CVE-2019-11091

我试过以下几种方法:

代码语言:javascript
复制
> echo -e $a | sed -r 's/.*(CVE-[0-9]{4}-[0-9]{4,6}).*/\1/g'
CVE-2019-11091
CVE-2019-11091

它只打印每行的最后一个匹配项:-)

如何打印所有匹配的分组?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-12 15:24:54

使用带有-o选项的grep,该选项将仅输出匹配的子字符串:

代码语言:javascript
复制
grep -o 'CVE-[0-9]\{4\}-[0-9]\{4,6\}' file > outputfile

注意,\{4\}中的大括号是转义的,因为这是默认的POSIX BRE引擎兼容的正则表达式。

对于sed,简单的解决方案是使用两个步骤:用换行符包装预期的匹配项,然后提取与您的模式完全匹配的匹配项:

代码语言:javascript
复制
pat='CVE-[0-9]\{4\}-[0-9]\{4,6\}'
sed "s/$pat/\n&\n/g"  file.txt | sed -n "/^$pat\$/p" > outputfile

输出:

代码语言:javascript
复制
CVE-2018-12126
CVE-2018-12127
CVE-2018-12130
CVE-2019-11091
CVE-2018-12126
CVE-2018-12127
CVE-2018-12130
CVE-2019-11091

请参阅online demo

票数 3
EN

Stack Overflow用户

发布于 2019-06-13 15:55:50

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed -E '/\n/!s/CVE-[0-9]{4}-[0-9]{4,6}/\n&\n/g;/^CVE-[0-9]{4}-[0-9]{4,6}/P;D' file

用换行符将所需的字符串括起来,然后仅打印这些行。

或者,如果您愿意:

代码语言:javascript
复制
regexp='CVE-[0-9]\{4\}-[0-9]\{4,6\}'
sed '/\n/!s/'$regexp'/\n&\n/g;/^'$regexp'/P;D' file
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56555740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档