2

我的 grep 命令是:

grep -Pzo -a 'Start(.*\n)*?.*?End' testfile.txt

并且 testfile.txt 包含:

ItsTestStartFromHereEndNotVisibleStartFrom
HereEndOkNotVisible

输出:

$ grep -Pzo -a 'Start(.*\n)*?.*?End' testfile.txt

StartFromHereEndStartFrom
HereEnd

它工作正常,但是当“开始”和“结束”之间存在空字符时,它不起作用。我知道这是因为我使用了“-z”选项,但我需要它来支持多行。

例如,这是我的带有空字符的内容:

ItsTestStartFrom[\x00]HereEndNotVisibleStart[\x00]From
HereEndOkNotVisible
4

1 回答 1

2

您可以perl改用

$ cat -A ip.txt
ItsTestStartFrom^@HereEndNotVisibleStart^@From$
HereEndOkNotVisible$

$ # -0777 will slurp the entire file, so NUL won't create issues
$ perl -0777 -ne 'print /Start.*?End/sg' ip.txt | cat -A
StartFrom^@HereEndStart^@From$
HereEnd$ 

$ perl -0777 -nE 'say /Start.*?End/sg' ip.txt
StartFromHereEndStartFrom
HereEnd

在给定的 OP 示例中,没有单个记录匹配,因为 NUL 字符出现在StartEnd部分之间......

$ cat -A ip.txt 
ItsTestStartFrom^@HereEndNotVisibleStart^@From$
HereEndOkNotVisible$
Start 3243$
asdf End asd$
$ grep -Pzo '(?s)Start.*?End' ip.txt
Start 3243
asdf End$ 
于 2018-01-03T08:01:48.270 回答