Не потрібно ставити етикетку :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виконується неявна команда.
Таким чином, сценарій в основному читається в першому рядку введення і продовжує додавати наступні рядки по одному, щоразу замінюючи новий рядок пробілом; після додавання останнього рядка (і \nзміни в пробілі) Nне може додати жодного рядка,s невдача, taпропускається, кінець сценарію досягається, і мається на увазі pзаява rint виконується на поточному просторі шаблону 1-рядкового шаблону Looong .
-iОпція замінює вхідний файл fileз усім шаблоном 1 лінії.