Швидка відповідь
sed ':a;N;$!ba;s/\n/ /g' file
- : a створити мітку "a"
- N додайте наступний рядок до простору візерунка
- $! якщо не останній рядок , ба гілка (перейти до) мітка "a"
- s заміну , / \ n / regex для нового рядка , / / пробілом , / g глобальної відповідності (стільки разів)
sed буде перебирати кроки від 1 до 3, поки не досягне останнього рядка, отримуючи всі рядки, що вміщуються у просторі шаблону, де sed замінить усі \ n символи
Альтернативи
Усім альтернативам, на відміну від sed , не потрібно буде доходити до останнього рядка, щоб розпочати процес
з баш , повільно
while read line; do printf "%s" "$line "; done < file
з перл , швидкістю сед- подібної швидкості
perl -p -e 's/\n/ /' file
з tr , швидше, ніж sed , може замінюватися лише одним символом
tr '\n' ' ' < file
з пастою , три- подібною швидкістю, може замінити лише один символ
paste -s -d ' ' file
з awk , tr- подібною швидкістю
awk 1 ORS=' ' file
Інша альтернатива, наприклад "echo $ (<файл)" повільна, працює лише на невеликих файлах і для початку процесу потрібно обробити весь файл.
5.10. Чому я не можу зіставити чи видалити новий рядок, використовуючи \ 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
("Як видалити блок певних послідовних рядків?"). Цей
приклад можна змінити, змінивши команду delete на щось
інше, наприклад, "p" (друк), "i" (вставити), "c" (змінити), "a" (додати)
або "s" (замінити) .
Вибір (3) не покладе \ п в просторі картини, але це дійсно
відповідає блок послідовних ліній, так що це може бути , що ви не
навіть потребуєте \ п , щоб знайти те , що ви шукаєте. Оскільки GNU sed
версія 3.02.80 тепер підтримує цей синтаксис:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
крім традиційних
адрес діапазону '/ звідси /, / туди / {...}' , можливо, уникнути використання \ n цілком.
tr
є лише правильним інструментом для роботи, якщо замінити один символ на один символ, тоді як приклад вище показаний заміни нового рядка пробілом .. Отже, у наведеному вище прикладі tr може працювати .. Але обмежуватиметься згодом.