Односторонняя дорога:
sed -e :a -e 's/^.\{1,29\}$/&0/;ta' -e n file
Соответствуйте любому символу (.) и соответствуйте 1 - 29 символам того же типа (1,29). Если успешное соответствие, помещенное '0' позади подобранного шаблона (&
). Когда сбои соответствия, что означает, когда количество символов, исключая первый символ превышает 29, остановите его, и следовательно мы получаем строковый нуль, дополненный 30.
n
в конце просто читает следующую строку и печатает его. Таким образом, четные строки печатаются нетронутые.
Выполнение вышеупомянутого сценария:
$ sed -e :a -e 's/^.\{1,29\}$/&0/;ta' -e n file
FSDFDSFSD000000000000000000000
FDSFD
FHGDHFDHGHFGHGHGF0000000000000
HHGDF
GFDGDFGFDG00000000000000000000
GFDGFDGFDGDFGDGD
Если только проблема в том, что GREP
лечит его как двоичный, скажите GREP
, чтобы найти его независимо от:
$ head /bin/bash > out
$ echo "test" >> out
$ grep test out
Binary file out matches
$ grep -a test out
test
из MAN GREEP
:
-a, --text
Process a binary file as if it were text; this is equivalent to
the --binary-files=text option.
Это может ответить на ваш вопрос, поэтому вот результаты нескольких Тесты, которые я просто бегал:
$ > output.txt
$ file output.txt
output.txt: empty
$ echo "" > output.txt
$ file output.txt
output.txt: very short file (no magic)
$ echo " " > output.txt
$ file output.txt
output.txt : ASCII text
Как вы можете видеть, файл не классифицирован так же, как вы на самом деле «поставить » в нем, когда вы пытаетесь его очистить. Следовательно, вы можете использовать пустую строку, а не просто ничего.
>
, что заставит grep думать, что файл является двоичным, потому что он является двоичным. Дело в том, что вы опустошили файл, но не остановили программу, которая его заполняла.
>output.txt
создает output.txt
, если он не существует, и усекает его до нулевой длины, если он существует.
В момент запуска >output.txt
происходит процесс tee
, в результате которого файл открыт. Усечение файла не влияет на позицию, на которой записывается tee
. Допустим, перед усечением был записан N байт. В следующий раз, когда tee
запишет после усечения, он начнёт запись с позиции N. Запись в позицию за текущим концом файла разрешена и заполняет начало файла нулевыми байтами.¹ Вот что здесь произошло.
Греп видит файл, который начинается с нескольких нулевых байт. Он корректно сообщает о файле как о двоичном файле.
Вы можете попросить GNU grep обращаться с файлом как с текстом, позвонив по телефону grep -a
. Она будет искать весь файл, включая нулевые байты (которые не совпадают, поэтому они не влияют на результат, если только в первой строке нет совпадений, но они могут вызвать замедление, если их много).
Лучшим решением будет сказать tee
, чтобы всегда запись производилась в текущем конце файла. К счастью (как заметил Стефан Чезелас), для этого есть возможность: tee -a
(присутствует на всех POSIX-совместимых системах). Сначала нужно укоротить файл.
>output.txt
nc -l -k -p 9100 | tee -a output.txt
¹ Большинство файловых систем допускают, чтобы блоки, полностью состоящие из нулевых байтов, оставались нераспределенными. Этот специализированный метод сжатия называется созданием разреженного файла .