Grep с редиректом дает нулевой байт

Моя команда grep генерирует байт NUL в конце своего вывода.

я имею file.xml который содержит только:

<Game>
    <Player p1="Bob"/>
    <Player p2="Fred"/>
</Game>

Сейчас работает grep -Pzo '<Game>(\n|.)*?(</Game>)' дает ожидаемый результат:

<Game>
        <Player p1="Bob"/>
        <Player p2="Fred"/>
</Game>

Но перенаправляя вывод с grep -Pzo '<Game>(\n|.)*?(</Game>)' file.xml > out.md показывает NUL-байт в конце файла при открытии в Notepad++ и открывается как бинарный файл в Sublime:

3c47 616d 653e 0a09 3c50 6c61 7965 7220
7031 3d22 426f 6222 2f3e 0a09 3c50 6c61
7965 7220 7032 3d22 4672 6564 222f 3e0a
3c2f 4761 6d65 3e00 

Это не происходит с другими командами grep, такими как grep -rlF "Game" > out.md,

1 ответ

Не знаю, какую платформу и версию grep используют, но я бы просто опустил опцию -z:

Из GNU grep 3.0 doc:

-z--null-data   
Treat input and output data as sequences of lines, each terminated by a zero byte (the ASCII NUL character) instead of a newline. Like the -Z or --null option, this option can be used with commands like ‘sort -z’ to process arbitrary file names. 

HEX файла file.xml:

0000000: 3c47 616d 653e 0a20 2020 203c 506c 6179  <Game>.    <Play
0000010: 6572 2070 313d 2242 6f62 222f 3e0a 2020  er p1="Bob"/>.
0000020: 2020 3c50 6c61 7965 7220 7032 3d22 4672    <Player p2="Fr
0000030: 6564 222f 3e0a 3c2f 4761 6d65 3e0a       ed"/>.</Game>.

Так работает:

grep -Po '<Game>(\n|.)*?(</Game>)' file.xml > out.md

HEX out.md:

0000000: 3c47 616d 653e 0a20 2020 203c 506c 6179  <Game>.    <Play
0000010: 6572 2070 313d 2242 6f62 222f 3e0a 2020  er p1="Bob"/>.
0000020: 2020 3c50 6c61 7965 7220 7032 3d22 4672    <Player p2="Fr
0000030: 6564 222f 3e0a 3c2f 4761 6d65 3e0a       ed"/>.</Game>.
Другие вопросы по тегам