Вы не подумайте, что я пытаюсь тролить или зафлудить форум, просто хочется разобраться до тонкостей.
Потому что, (вот как сейчас), придётся по серьёзному что то написать и начнут вылазить ошибки, найти которые будет очень трудно, из-за плохого знания материала. Может это обсуждение ещё кому нибудь кроме меня поможет разобраться в данном вопросе до тонкостей и в дальнейшем не совершать ошибок.
Bizdelnick писал: ↑20.04.2019 14:40
v4567 писал: ↑20.04.2019 14:19
здесь вот не понятно \n это два символа "\" плюс "n" или это символ перевода строки?
В левой части выражения s/// используется синтаксис регулярных выражений POSIX, в правой — простой текст с экранированными последовательностями. В обоих случаях \n озничает символ перевода строки, чтобы такая последовательность не интерпретировалась — перед \ добавляется ещё один \. То есть данная команда заменяет переводы строки на последовательность \n.
Если это так, то не понятно почему надо запихивать в буфер. Без буфера почему то не работает.
Вот пример.
Создаю директорию и в ней файл с переводом строки посередине. Всё делаю из командной строки, а не в скрипте.
Код: Выделить всё
mkdir /dir
touch $'/dir/11\n11'
ls /dir
11?11
ls вместо перевода строки подставил вопросительный знак, а может это и не ls сделал...., так как вот выводы командой find
Код: Выделить всё
find "/dir" -type f
/dir/11?11
find "/dir" -type f -print0
/dir/11
11
В первом случае find получается то же поставил вместо перевода строки вопросительный знак и в конце названия файла всё таки перевёл на новую строку.
А во второй строке с -print0 всё произошло наоборот, в середине файла сработал перевод строки, а в конце он был заменён на нулевой символ. -print0 получается ставит нулевой символ только в конце строки, а не меняет его в строке где бы он не встречался. В мане про -print0 сказано, что
Правда; выведите полное имя файла на стандартный вывод, за которым следует ноль символ (вместо символа новой строки, который использует -print). Это позволяет имена файлов, содержащие символы новой строки или другие типы пробелов, прямо интерпретируется программами, которые обрабатывают результаты поиска. Этот вариант соответствует опции -0 xargs.
Это перевод гугла, английского я не знаю, так что приходится пользоваться переводчиками. И из перевода я понял, что везде символ перевода строки должен был замениться на нулевой символ.
Едем дальше:
Код: Выделить всё
find "/dir" -type f | sed ':a;N;$!ba;s/\n/\\n/g'
/dir/11\n11
find "/dir" -type f | sed 's/\n/\\n/g'
/dir/11
11
find "/dir" -type f | sed ':a;N;$!ba'
/dir/11
11
В первом случае заменился, при этом в конце названия файла остался перевод строки.
Во втором случае не заменился и в середине названия файла и в конце, не понятно почему?
В третьем случае то же не заменился ни в середине ни в конце.
Не понятен второй случай. Получается что буфер нужен, но не понятно какую роль он играет?