Sed: заменить символы новой строки на "-z"? - PullRequest
0 голосов
/ 27 сентября 2018

Проблема: заменить некоторое регулярное выражение на \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'персонаж)

Так как я не нашел ни одного поста, связанного с этим, я думаю, что я мог бы что-то недопонимать здесь ... Так, что это действительно делает?Почему это работает?

1 Ответ

0 голосов
/ 27 сентября 2018

Использование -z меняет то, что sed считает строкой.\n остается \n, но это не конец строки, но \0 будет.Поскольку в выводе seq нет нулевых байтов, весь вывод считается одной строкой и обрабатывается за одну итерацию (т.е. заменяет все \n пробелами).

...