首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在两个标签之间加注不适用于选项-z?怎么修?

为什么在两个标签之间加注不适用于选项-z?怎么修?
EN

Unix & Linux用户
提问于 2021-11-23 15:30:20
回答 2查看 24关注 0票数 0

本案:

代码语言:javascript
复制
$ cat t01.txt
xxxyyyzzz

$ cat t01.txt | grep -Po '(?<=xxx).*(?=zzz)'

在以下方面的成果:

代码语言:javascript
复制
yyy

这是意料之中的。

然而,本案:

代码语言:javascript
复制
$ cat t02.txt
xxx
yyy
zzz

$ cat t02.txt | grep -Pzo '(?<=xxx).*(?=zzz)'

在以下方面的成果:

代码语言:javascript
复制

这是出乎意料的。

为什么以及如何修复?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-11-23 15:39:05

因为默认情况下,.与Perl中的换行符不匹配。您需要显式地匹配它,或者在正则表达式中使用s标志:

代码语言:javascript
复制
$ < t02.txt grep -Pzo '(?<=xxx\n).*\n(?=zzz)'
yyy
$ < t02.txt grep -Pzo '(?s)(?<=xxx).*(?=zzz)'

yyy

例如,见perlre手册页

在“元字符”一节中:

。匹配除在/s下,包括换行符中没有的换行符以外的任何单个字符

在“修饰语”中:

s将字符串视为单行。也就是说,更改"."以匹配任何字符,甚至换行符,这通常是不匹配的。

票数 2
EN

Unix & Linux用户

发布于 2021-11-23 15:40:32

这实际上是预期的行为。.包括除换行符以外的任何字符。您要寻找的正则表达式是:

代码语言:javascript
复制
(?<=xxx)\n*.*\n*(?=zzz)

这里有一个很好的站点来测试你的正则表达式,它也解释了它的每个部分,所以你总是知道为什么它的行为是这样的:https://regex101.com

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/678744

复制
相关文章

相似问题

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