当存在空字符且使用 -z 选项时 Grep 不工作

Grep not working when null character exists and -z option used

我的grep命令是:

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

并且testfile.txt包含:

ItsTestStartFromHereEndNotVisibleStartFrom
HereEndOkNotVisible

输出:

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

StartFromHereEndStartFrom
HereEnd

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

比如我的内容是空字符:

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

您可以改用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$