Не потрібно ставити етикетку :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 лінії.