当存在空字符且使用 -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 字符出现在 Start
和 End
部分之间...
$ cat -A ip.txt
ItsTestStartFrom^@HereEndNotVisibleStart^@From$
HereEndOkNotVisible$
Start 3243$
asdf End asd$
$ grep -Pzo '(?s)Start.*?End' ip.txt
Start 3243
asdf End$
我的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 字符出现在 Start
和 End
部分之间...
$ cat -A ip.txt
ItsTestStartFrom^@HereEndNotVisibleStart^@From$
HereEndOkNotVisible$
Start 3243$
asdf End asd$
$ grep -Pzo '(?s)Start.*?End' ip.txt
Start 3243
asdf End$