尝试使用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
$