Быстрый ответ
sed ':a;N;$!ba;s/\n/ /g' file
- : создать ярлык «а»
- N добавить следующую строку в пространство образца
- $! если не в последней строке , ба ветвь (перейти к) метка «а»
- s заменить , / \ n / regex для новой строки , / / через пробел , / g глобальное совпадение (столько раз, сколько это возможно)
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- like speed, может заменить только один символ
paste -s -d ' ' file
с awk , tr- like скоростью
awk 1 ORS=' ' file
Другая альтернатива, такая как «echo $ (<file)» , работает медленно, работает только с небольшими файлами и должна обработать весь файл, чтобы начать процесс.
5.10. Почему я не могу сопоставить или удалить символ новой строки, используя escape-
последовательность \ n ? Почему я не могу сопоставить 2 или более строк, используя \ n?
\ N никогда не будет соответствовать новой строке в конце строки, потому что
новая строка всегда удаляется перед тем, как строка помещается в
пространство шаблона. Чтобы получить 2 или более строк в пространство шаблона, используйте
команду «N» или что-то подобное (например, «H; ...; g;»).
Sed работает следующим образом: sed читает по одной строке за раз, отсекает
завершающую новую строку , помещает то, что осталось, в пространство шаблона, где
сценарий sed может обратиться или изменить его, а когда пространство шаблона
печатается, добавляет новую строку в stdout (или в файл). Если
пространство шаблона полностью или частично удалено с помощью «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, имеют ограничения по размеру
буфера шаблонов, здесь предпочтительнее использовать утилиту «tr» Unix.
Если последняя строка файла содержит новую строку, GNU sed добавит
эту новую строку в вывод, но удалит все остальные, тогда как tr
удалит все новые строки.
Чтобы сопоставить блок из двух или более строк, есть 3 основных варианта:
(1) используйте команду 'N', чтобы добавить следующую строку в пространство шаблона;
(2) использовать команду «H» как минимум дважды, чтобы добавить текущую строку
в пространство удержания, а затем извлечь строки из пространства удержания
с помощью x, g или G; или (3) использовать диапазоны адресов (см. раздел 3.3 выше)
для сопоставления линий между двумя указанными адресами.
Варианты (1) и (2) будут помещать \ n в пространство шаблона, где к нему
можно обращаться по своему усмотрению ('s / ABC \ nXYZ / alphabet / g'). Один из примеров
использования N для удаления блока строк приведен в разделе 4.13
(«Как удалить блок из определенных последовательных строк?»). Этот
пример можно изменить, изменив команду удаления на что
- то другое, например «p» (печать), «i» (вставка), «c» (изменение), «a» (добавление)
или «s» (замена) ,
Выбор (3) не положит \ п в пространстве картины, но это действительно
соответствует блок последовательных линий, так что это может быть , что вы не
даже нуждаетесь в \ п , чтобы найти то , что вы ищете. Начиная с GNU sed
версии 3.02.80, теперь поддерживается следующий синтаксис:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
в дополнение к традиционным диапазонам
адресов «/ from here /, / to there / {...}» , возможно, можно полностью избежать использования \ n.
tr
является только правильным инструментом для задания, если заменить один символ для одного символа, в то время как в приведенном выше примере показано заменить символ новой строки пробелом. Так что в приведенном выше примере tr может работать .. Но будет ограничение позже.