Нет необходимости помещать метку :aза пределы основной инструкции, и при этом не -eтребуется необходимая опция; наконец, /$/лишнее (каждая строка имеет символ EOL).
Улучшая другие ответы, каждый получает
sed -i ':a; N; s/\n/ /; ta' file
Что яснее, если написано так:
sed -i ':a
N
s/\n/ /
ta' file
Команда работает следующим образом:
N добавляет следующую строку к (многострочному) шаблонному пространству, которое уже содержит текущую строку;
s/\n/ /заменить символ новой строки, \nсгенерированный Nс помощью пробела ;
taпереходит к строке сценария, следующей за меткой, :a до тех пор, пока замена на шаге 2 прошла успешно , т. е. если замена произошла, выполнение переходит на шаг 1 без «удара» по концу сценария, т.е. без чтения другой строки ввода.
Обратите внимание на следующее;
sedчитает строки входного файла по порядку, начиная с 1-й строки ;
:a это просто метка, а не команда для выполнения;
N в принципе выполняется на любой строке, но
s/\n/ /(в принципе выполняется на любой строке) успешно на любой строке, кроме последней , поэтому
taделает конец скрипта достижимым только тогда, когда читается последняя строка ввода (единственная строка, где происходит sсбой), поэтому
- никакая дополнительная входная строка не будет считана в пространство шаблона после того, как в него будет прочитана 1-я строка , если только не будет прочитана последняя , но затем нет дополнительной строки для чтения и неявная
pкоманда выполняется.
Таким образом, скрипт в основном читает в 1-й строке ввода и продолжает добавлять следующие строки одну за другой, каждый раз заменяя новую строку пробелом; после добавления последней строки (и \nизменения в пробеле) Nне может быть добавлена ни одна строка, происходит sсбой, taпропускается , достигается конец сценария, и подразумеваемый pоператор rint выполняется в текущем однолинейном пространстве шаблона ,
-iОпция заменяет входной файл fileсо всем шаблоном 1 линии.