Grep с редиректом дает нулевой байт - PullRequest
0 голосов
/ 16 ноября 2018

Моя команда 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 в конце файла при открытии в Notepad ++ отображается байт NUL, а в 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 Ответ

0 голосов
/ 20 ноября 2018

Не знаю, какую платформу и версию 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>.
...