grep -Pzo:如何使重定向输出成为 ASCII 文本(而不是数据)?

grep -Pzo:如何使重定向输出成为 ASCII 文本(而不是数据)?
$ 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

-zto 标志旨在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

相关内容