pcregrep 换行后断言错误?

pcregrep 换行后断言错误?

尝试使用pcregrep打印空行后的第一行。例如,文件的内容

first line

second line

我需要second line打印。以下是一些始终使用相同正则表达式的测试

使用Python 2.7

python -c "import re; print re.search(r'(?<=\n\n).*?$',\
    open('file').read(), re.MULTILINE).group()"
second line

使用 GNU grep 2.16

grep -oPz  '(?<=\n\n).*?$' file
second line

使用 pcregrep 版本 8.12

pcregrep -Mo  '(?<=\n\n).*?$' file
(no output)

基于一些测试,pcregrep一般支持lookbehind断言,但似乎无法\n特别处理lookbehind断言内的情况。\n在前瞻断言内没有问题。

在 RHEL 和 Ubuntu 上进行了测试。有任何想法吗?

答案1

显然你可以指定pcregrep你想要它寻找什么类型的换行符。交换机-N在使用 PCRE 模式时执行此操作。

-N newline-type, --newline=newline-type PCRE 库支持五种不同的约定来指示行尾。它们是单字符序列 CR(回车)和 LF(换行)、两字符序列 CRLF、“anycrlf”约定,它识别前面三种类型中的任何一种,以及“any”约定,其中任意假定 Unicode 行结束序列结束一行。 Unicode 序列就是刚才提到的三个,加上 VT(垂直制表符,U+000B)、FF(换页符,U+000C)、NEL(下一行,U+0085)、LS(行分隔符,U+2028)、和 PS(段落分隔符,U+2029)。

构建 PCRE 库时,会指定默认的行结束序列。这通常是操作系统的标准顺序。除非此选项另有指定,否则 pcregrep 使用库的默认值。此选项的可能值为 CR、LF、CRLF、ANYCRLF 或 ANY。这使得可以使用 pcregrep 扫描来自其他环境的文件,而无需修改其行结尾。如果正在扫描的数据不符合此选项设置的约定,则 pcregrep 的行为可能会很奇怪。请注意,此选项不适用于由 -f、--exclude-from 或 --include-from 选项指定的文件,这些文件预计使用操作系统的标准换行符序列。

例子

$ pcregrep -Mo  -N CRLF '(?<=\n\n).*?$' sample.txt 
second line

$

其他奇怪的行为

有趣的是,从后视更改为前视会产生结果:

$ pcregrep -Mo  '(?>\n\n).*?$' sample.txt 


second line
$

相关内容