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

问题描述 投票:2回答:1

我的grep命令是这样的:

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

和testfile.txt是这样的:

ItsTestStartFromHereEndNotVisibleStartFrom
HereEndOkNotVisible

输出:

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

StartFromHereEndStartFrom
HereEnd

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

例如,它是我的内容与空字符:

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

我该怎么办?谢谢。

bash sed grep nullable
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$ 
© www.soinside.com 2019 - 2024. All rights reserved.