我的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
我该怎么办?谢谢。
你可以用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$