Unix命令只grep以“ xyz ....”开头的子字符串,直到第一个空格?

时间:2018-11-22 08:20:01

标签: regex unix grep

我有一条短信:

这是my = test和class = 76

这是my = test和class = 78

这是my = test2和class = 76

这是my = test3和class = 75

这是my = test1和class = 79。

我想对所有以“ class =”开头的单词进行grep替换,而不打印输出的全部内容:

class=76
class=78
class=76
class=75
class=79

有什么可以帮助我的命令吗?

我尝试过这个:

grep -E '(^|\s+)class=(?=\s|$)' file

但未获得任何输出。

2 个答案:

答案 0 :(得分:5)

您的(^|\s+)class=(?=\s|$)模式不符合POSIX,因为它包含一个正向的(?=\s|$)前瞻性,用于匹配后面跟有空格或字符串末尾位置的位置。由于您想在class=之后匹配数字,因此即使在PCRE正则表达式中,这种前瞻也没有意义。 (^|\s+)组旨在匹配字符串的开头或1个或多个空格,但是似乎只有一个字边界会在这里起作用。

您可以使用

grep -oE '\<class=[^ ]+' file

请参见online demo

详细信息

  • o-启用输出模式,仅输出匹配项
  • E-启用POSIX ERE语法
  • \<-单词边界(也可以使用\b
  • class=-文字字符串
  • [^ ]+-除空格以外的1个或多个字符

等效的BRE POSIX版本:

grep -o '\<class=[^ ]*' file

使用 grep(GNU grep)2.27 进行了测试。

答案 1 :(得分:1)

使用Perl-oneliner

> data="This is my=test and class=76 This is my=test and class=78 This is my=test2 and \n class=76 This is my=test3 and class=75 This is my=test1 and class=79."
> perl -0777 -ne ' { while(/(class=(\d+))/g) { print "$1\n" } } ' <<< "$data"                                                                                   
class=76
class=78
class=76
class=75
class=79
> 

有效,即使您将数据保存在文件中

> echo "$data" > gupta.txt
> perl -0777 -ne ' { while(/(class=(\d+))/g) { print "$1\n" } } ' gupta.txt 
class=76
class=78
class=76
class=75
class=79
>