Быстрый ответ:
sed ':a;N;$!ba;s/\n/ /g' file
- : a создать ярлык 'a'
- N добавить следующую строку в пространство образца
- $! если не последняя строка , ba ветвь (перейти к) метка 'a'
- с заменить , / \ n / регулярное выражение для новой строки , / / через пробел , / г глобальное совпадение (столько раз, сколько возможно)
sed будет перебирать шаги с 1 по 3 до тех пор, пока не достигнет последней строки, в результате чего все строки поместятся в пространство шаблона, где sed заменит все \ n символов
Альтернативы
Все альтернативы, в отличие от sed , для начала процесса не нужно достигать последней строки
с удар , медленно
while read line; do printf "%s" "$line "; done < file
с perl , sed -подобная скорость
perl -p -e 's/\n/ /' file
с tr , быстрее, чем sed , можно заменить только одним символом
tr '\n' ' ' < file
с вставкой , tr -подобной скоростью, можно заменить только одним символом
paste -s -d ' ' file
с awk , tr -подобная скорость
awk 1 ORS=' ' file
Другая альтернатива, такая как "echo $ ( работает медленно, работает только с небольшими файлами и требует обработки всего файла, чтобы начать процесс.
Длинный ответ из sed FAQ 5.10 :
5,10. Почему я не могу сопоставить или удалить символ новой строки с помощью \ n escape
последовательность? Почему я не могу сопоставить 2 или более строк, используя \ n?
\ n никогда не будет соответствовать новой строке в конце строки, потому что
символ новой строки всегда удаляется до помещения строки в
образец пространства. Чтобы получить 2 или более строк в пространство шаблона, используйте
команда 'N' или что-то подобное (например, 'H; ...; g;').
Sed работает следующим образом: sed читает по одной строке за раз, отключает
завершающий перевод строки, помещает то, что осталось в пространство шаблона, где
Сценарий Sed может адресовать или изменять его, и когда образец пространства
печатается, добавляет новую строку в стандартный вывод (или в файл). Если
пространство образца полностью или частично удаляется с помощью 'd' или 'D',
В таких случаях добавляется символ новой строки , а не . Таким образом, сценарии типа
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
НИКОГДА не будет работать, потому что завершающий символ новой строки удаляется до
линия помещается в пространство шаблона. Для выполнения вышеуказанных задач
используйте вместо этого один из этих сценариев:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Поскольку версии sed, кроме GNU sed, имеют ограничения на размер
буфер шаблонов, утилита Unix 'tr' должна быть здесь предпочтительней.
Если последняя строка файла содержит символ новой строки, GNU sed добавит
перевод строки в вывод, но удаление всех остальных, тогда как tr будет
удалить все новые строки.
Чтобы сопоставить блок из двух или более строк, есть 3 основных варианта:
(1) используйте команду 'N', чтобы добавить следующую строку в пространство шаблона;
(2) использовать команду «H» как минимум дважды, чтобы добавить текущую строку
в пространство удержания, а затем получить линии из пространства удержания
с х, г или G; или (3) использовать диапазоны адресов (см. раздел 3.3 выше)
чтобы сопоставить строки между двумя указанными адресами.
Выбор (1) и (2) поместит \ n в пространство шаблона, где оно
могут быть адресованы по желанию ('s / ABC \ nXYZ / алфавит / g'). Один пример
использование 'N' для удаления блока строк приведено в разделе 4.13
(«Как удалить блок из определенных последовательных строк?»). Это
пример можно изменить, изменив команду delete на что-то
иначе, например, «p» (печать), «i» (вставка), «c» (изменение), «a» (добавление),
или 's' (заменить).
Выбор (3) не помещает \ n в пространство шаблона, но он делает
сопоставлять блок последовательных строк, поэтому может быть, что вы не
даже нужно \ n, чтобы найти то, что вы ищете. С GNU sed
версия 3.02.80 теперь поддерживает этот синтаксис:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
в дополнение к традиционному диапазону '/ from here /, / to there / {...}'
адресов, возможно, можно полностью избежать использования \ n.