Проблема: заменить некоторое регулярное выражение на \n
на sed
.
Решение: есть много похожих ответов [ 1 ] [ 2 ] [ 3 ] [ 4 ] и многие другие ссылки, на которые я не буду ссылаться.Все они предлагают вам создать новую метку :a
, объединить строки N
, перейти на :a
, если не конец файла $!ba
, а затем выполнить некоторую команду.
Тем не менее ... В руководстве GNU sed есть опция -z
:
-z
--null-data
--zero-terminated
Treat the input as a set of lines, each terminated by a zero byte
(the ASCII ‘NUL’ character) instead of a newline. This option can
be used with commands like ‘sort -z’ and ‘find -print0’ to process
arbitrary file names.
Итак, во-первых, для сравнения, если мы попробуем наивный подход:
$ seq 3 | sed 's/\n/ /g'
1
2
3
Однако, используя эту опцию -z
:
$ seq 3 | sed -z 's/\n/ /g'
1 2 3
Реальный вопрос: почему?
Учитывая, что он «объединяет» все строки, как указано вдокументации, я ожидал, что мне придется использовать \0
вместо \n
, так как:
Обрабатывать ввод как набор строк, каждая из которых заканчивается нулевым байтом (ASCII 'NUL'персонаж)
Так как я не нашел ни одного поста, связанного с этим, я думаю, что я мог бы что-то недопонимать здесь ... Так, что это действительно делает?Почему это работает?