sed заменяет символ новой строки пробелом

Сообщается, что апстрим и апстрим сообщают, что это было исправлено в 2015 году:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=786705

однако я все еще вижу эту ошибку на моем Debian 8.8 с установленным debconf -1.5.56.all, машина была установлена ​​в 2016 году.

чтобы исправить это, я побежалapt-get install debconf

вы можете запустить apt-get dist-upgradeдля обновления всех пакетов в системе, но будьте осторожны, он может обновиться до 8.8 -> 9.0

0
13.09.2019, 23:33
4 ответа

tr, вероятно, лучший инструмент для этой работы. Попробуйте следующее

pbpaste | tr '\n' ' '

С вашей помощью я получаю следующий результат.

I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour...  -- F. H. Wales (1936) 
6
28.01.2020, 02:14

Я согласен с @QIS.

Есть несколько причин, по которым sed вам не подойдет.

Одна из них заключается в том, что по умолчанию sedобрабатывает свой ввод построчно, и по этой причине sedникогда не увидит новую строку как часть строки. По умолчанию это разделитель между строками .

Другое дело, что, хотя GNU sedреализует '\n'представление новой строки, BSDsed(версия для OSX )этого не делает.

Только для будущих пользователей GNU sed, которые могут прочитать ваш вопрос, GNU sedможно указать обрабатывать входной файл как список строк с разделителями NUL -, используя опцию -z. Предполагая, что ваш ввод не содержит байтов NUL, это может быть вариантом для пользователей GNU sed:

.
$ pbpaste | sed -z 's/\n/ /g'

Одним из тривиальных (и не -рекомендуемых )методов является использование преимущества того факта, что когда echoполучает символы новой строки без кавычек в результате подстановки команд, он заменяет их пробелами. Кроме того, echoпреобразует несколько пробелов (или новых строк )в один пробел. Таким образом, вполне вероятно, что это сработает и для вас :

.
echo $(pbpaste)
1
28.01.2020, 02:14

Вы можете сделать это с помощьюsed(даже без расширения GNU -zslurp ), используя команду Nв цикле:

$ sed -e :a -e '$!N;s/ *\n */ /;ta' -e 'P;D' input
 I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour... -- F. H. Wales (1936)                  

Для обсуждения по существу эквивалентной команды см., например, 40. Добавить строку к предыдущей, если она начинается со знака равенства "=" в Sed One -Объяснение вкладышей, часть я

2
28.01.2020, 02:14

И fmt, и parявляются хорошими инструментами для повторного -форматирования текста.

Оба они могут использоваться для переформатирования текста в одну длинную строку после замены перевода строки пробелами (, например. сtr):

$ tr '\n' ' ' < input.txt | fmt -w 999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour...    -- F. H. Wales (1936)

$ tr '\n' ' ' < input.txt | par w999
I cannot conceive that anybody will require multiplications at the rate of 40,000 or even 4,000 per hour... -- F. H. Wales (1936)

Обратите внимание, что вывод функций fmt и par немного отличается. fmt имеет четыре пробела между ...и --, а par сводит их к одному пробелу.


Подробнее о fmtиpar:

fmt— это стандартная утилита, которая существует уже несколько десятилетий и должна быть доступна практически в любой системе unix. В системах GNU/Linux он находится в пакете GNU coreutils.

$ fmt < input.txt 
I cannot conceive that anybody will require multiplications at the rate
of 40,000 or even 4,000 per hour...

  -- F. H. Wales (1936)

Тем не менее, он очень прост и не позволяет в значительной степени контролировать способ переформатирования абзацев, а также не выполняет какой-либо специальной обработки начальных и/или конечных символов (, например >цитирования в электронной почте или /*... */комментарии ), что может привести к беспорядку.

parгораздо более гибок и функционален. Он может переформатировать комментарии и текст в рамках стиля C /*... */, сообщения электронной почты с несколькими уровнями цитирования и многое другое. Следующий пример не показывает, на что он действительно способен.

$ par < input.txt 
I cannot conceive that anybody will require multiplications at the rate of
40,000 or even 4,000 per hour...

  -- F. H. Wales (1936)

Следующий пример (изman par)начинает показывать возможности par:

Before:

   John writes:
   : Mary writes:
   : + Anastasia writes:
   : + > Hi all!
   : + Hi Ana!
   : Hi Ana & Mary!
   Please unsubscribe me from alt.hello.

After "par Q+:+ q":

   John writes:

   : Mary writes:
   :
   : + Anastasia writes:
   : +
   : + > Hi all!
   : +
   : + Hi Ana!
   :
   : Hi Ana & Mary!

   Please unsubscribe me from alt.hello.

Я использую его ежедневно из vi/vim с тех пор, как открыл для себя 1990-е годы, чтобы переформатировать электронные письма, которые я пишу (или электронные письма от других с нечитаемыми длинными строками ), комментариями к коду и другим текстом. ИМО, номинал обязателен, должен -иметь программу.

1
28.01.2020, 02:14

Теги

Похожие вопросы