$ cat t2.c
xxx
$ grep -Pzo xxx t2.c
xxx
$ grep -Pzo xxx t2.c > out1 && file out1
out1: data
在这里我们看到它out1
是 a data
(而不是ASCII text
)。如何使其成为 ASCII 文本?
UPD。-z
多行匹配需要。这是一个更新的示例:
$ cat t2.c
xxx
yyy
zzz
$ grep -Pzo '(?s)xxx.*zzz' t2.c
xxx
yyy
zzz
$ grep -Pzo '(?s)xxx.*zzz' t2.c > out1 && file out1
out1: data
答案1
用你自己的例子,
echo xxx >t2.c
grep -Pzo xxx t2.c > out1 && file out1
out1: data
grep -Po xxx t2.c > out1 && file out1
out1: ASCII text
-z
to 标志旨在grep
与 NULL 终止的数据一起使用,既用于输入,也用于输出(这里更重要的是)。引用自文档(man grep
):
-z, --null-data
将输入和输出数据视为行序列,每行以零字节(ASCII NUL 字符)而不是换行符结尾。与 -Z 或 --null 选项一样,此选项可以与 sort -z 等命令一起使用来处理任意文件名。
如果您使用以下工具,您可以看到这一点od
:
$ od -c out1
0000000 x x x \0
0000004
\0
最后就是NULL 。该file
命令看到 NULL 字符并正确确定该文件不能是 ASCII,甚至不能是任何其他类型的文本。后退点是不确定的data
,这就是您所看到的。
解决方案?-z
除非您希望输入提供以 NULL 结尾的记录,否则请勿使用和您的输出也可以用 NULL 终止的记录分隔。或者,您可以在保存到文件之前简单地删除 NULL:
$ grep -Pzo xxx t2.c | tr -d '\0' > out1 && file out1
out1: ASCII text, with no line terminators