我有一条短信:
这是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
但未获得任何输出。
答案 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
>