Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: sed. Объединение некоторых строк.  (Прочитано 1438 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Punko

  • Автор темы
  • Гость
sed. Объединение некоторых строк.
« : 06 Октября 2016, 17:27:58 »
добрый день. Есть один файл (дамп календаря).
иногда встречаются разорванные строки, а именно:

blah-blah-blah-blah-blah-blah-blah-blah-blah bl
 ah-blah-blah

Вопрос - как красиво склеить именно такие строки - убрать пробел и перенос строки с предыдущей строчки?

убрать пробел я могу, но вот нормально склеить - нет.
В голову лезут только дикие варианты с запоминанием номера строки и удалением переноса в цикле.  :o

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12130
  • Xubuntu 22.04
    • Просмотр профиля
    • Github
Re: sed. Объединение некоторых строк.
« Ответ #1 : 06 Октября 2016, 17:56:52 »
Убрать переносы строк = заменить \n на ''
а вместе с пробелами - \s на ''
\s = это все пробелы, табуляции переносы строк и прочие пробельные символы.


sed 's/\s//'
« Последнее редактирование: 06 Октября 2016, 18:02:33 от Sly_tom_cat »
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: https://help.ubuntu.ru/wiki/uefiboot

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: sed. Объединение некоторых строк.
« Ответ #2 : 06 Октября 2016, 17:58:20 »
Punko, как понять что строка разорвана? Если удалять всё, то выглядеть будет примерно так
Код: (bash) [Выделить]
sed ':a; /$/N; s/\n //; ta'
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Punko

  • Автор темы
  • Гость
Re: sed. Объединение некоторых строк.
« Ответ #3 : 06 Октября 2016, 18:39:39 »
Да,но проблема именно в том, что файл на 10к+ строк, и разорванніе встречаются рандомно.

как понять, что она разорвана - на следующей есть пробел (и только в єтом случае пробле)
« Последнее редактирование: 06 Октября 2016, 18:43:03 от Punko »

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: sed. Объединение некоторых строк.
« Ответ #4 : 06 Октября 2016, 20:28:24 »
Punko, малость не подумал... Данный скрипт как раз и решает проблему. Он ищет перенос строки а за ней пробел
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Punko

  • Автор темы
  • Гость
Re: sed. Объединение некоторых строк.
« Ответ #5 : 06 Октября 2016, 20:34:40 »
alsoijw, так перенос строки же идёт в конце строки?

Проблему я решил костылём - греплю нужную строчку + 1 и объединяю принадобности, но решение с седом интересно.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: sed. Объединение некоторых строк.
« Ответ #6 : 06 Октября 2016, 21:34:09 »
Punko, данное решение исчет два последовательно идущих символа. Если после переноса строки идёт пробел - удалит.
echo -e '1\n 2\n 3\n4 5' | sed ':a; /$/N; s/\n //; ta'
123
4 5
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: sed. Объединение некоторых строк.
« Ответ #7 : 07 Октября 2016, 00:34:55 »
sed -z 's/\n //g'Если нет такой опцииsed ':a;N;s/\n //;/\n/{P;D;};$!ba'
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Punko

  • Автор темы
  • Гость
Re: sed. Объединение некоторых строк.
« Ответ #8 : 07 Октября 2016, 10:43:25 »
sed -z 's/\n //g'

Спасибо, вот это сработало.

Второй вариант не сработал.
alsoijw, тоже не сработал.

Azure, вопрос о том, как это работает.
Ключом -z мы, грубо говоря превращаем весь документ в строку? И потом там ищем последовательность переноса и пробела, да?

А вот второй вариант, равно как и вариант alsoijw для меня тёмный лес :(

_________________
Up. Второй вариант также рабочий, то я затупил при проверке.
« Последнее редактирование: 07 Октября 2016, 11:02:34 от Punko »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: sed. Объединение некоторых строк.
« Ответ #9 : 07 Октября 2016, 11:36:52 »
Код: (bash) [Выделить]
sed '
    :a        # метка «а»
    N         # присоединить следующую строку: получится «строка1\nстрока2»
    s/\n //   # удалить «\n »(новая_строка+пробел)
    ta        # если замена произошла вернуться на метку «а» с «строка1строка2»
    P         # если не произошла(не было «\n »), напечатать «строку1»(до «\n»)
    D         # убрать по «\n»(новой_строки) и начать с начала скрипта (с «строка2»)
    '
« Последнее редактирование: 07 Октября 2016, 11:39:26 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Punko

  • Автор темы
  • Гость
Re: sed. Объединение некоторых строк.
« Ответ #10 : 07 Октября 2016, 11:51:36 »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !
Azure вот уж правда.... спасибо за пояснение.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: sed. Объединение некоторых строк.
« Ответ #11 : 07 Октября 2016, 14:20:20 »
Ключом -z мы, грубо говоря превращаем весь документ в строку? И потом там ищем последовательность переноса и пробела, да?
Нет. Мы заставляем sed рассматривать '1\n1' не как две строки '1' и '1' а как '1\n1'
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Punko

  • Автор темы
  • Гость
Re: sed. Объединение некоторых строк.
« Ответ #12 : 07 Октября 2016, 14:55:29 »
alsoijw, да, это я и имел ввиду, спасибо за уточнение.

 

Страница сгенерирована за 0.026 секунд. Запросов: 23.