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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Удалить перенос строки и сделать замену при помощи SED  (Прочитано 20088 раз)

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

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
Есть данные такого формата
ololo.txt
(Нажмите, чтобы показать/скрыть)

Хочу убрать перенос строк и сразу же заменить 0d0a на \n.

Вот такой сед не пашет =(. Никак не получается убрать перенос строки.
Цитировать
cat ololo.txt | sed  "s/\n//;s/0d0a/\n/g"

uname -a
Linux 89-149-244-77.local 2.6.32-21-generic-pae #32-Ubuntu SMP Fri Apr 16 09:39:35 UTC 2010 i686 GNU/Linux

sed --version
GNU sed version 4.2.1


Пользователь решил продолжить мысль 06 Февраль 2012, 22:09:57:
Нашел пример
Этот пример показывает, как можно объединить строки разделённые возвратом каретки:

cat /etc/hosts | sed ':a; /$/N; s/\n//; ta'

Но как сюда добавить замену 0d0a после этой обработки не ясно.

Конечно можно сделать
cat /etc/hosts | sed ':a; /$/N; s/\n//; ta' | sed 's/0d0a/\n/g'Но в случае моей задачи потеряется многострочность при передачи в конвеере и скрипт попросту подвиснет
« Последнее редактирование: 06 Февраль 2012, 23:13:38 от evtuhovdo »
ubuntu server 10.04 lucid

andrey_p

  • Гость
cat FILE | tr -d '\n' | sed 's/0d0a/\\n/g'Если нужна замена на буквальный символ новой строки:
cat FILE | tr -d '\n' | sed 's/0d0a/\n/g'ЗЫ Любишь ты все усложнять, из-за чего, может быть, и проблемы. Не надо использовать sed для многострочной обработки, даже простой. Ну только если развлечения ради. :)

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
andrey_p, ты всё правильно написал, но если у тебя источником данных является команда без окончания вывода, то попросто sed не найдёт окончания после команды  tr -d '\n' и зависнет в бесконечном ожидании.

Временно решил вопрос вот так:
sed -e 's/$/Y/g' | sed -u 's/0d0a/0d0aX\n/g' | sed ':a; /Y$/N; s/\n//g; ta;' но это натуральный изврат. Мечтаю сделать это в одну SED команду.

Быть может спецы по SED тут есть =))
ubuntu server 10.04 lucid

Оффлайн terrible_user

  • Активист
  • *
  • Сообщений: 438
    • Просмотр профиля
но это натуральный изврат. Мечтаю сделать это в одну SED команду.

sed -e ':a;N;$!ba;s/\n//g;s/0d0a/\n/g' ololo.txt
 :-X
Бери больше, кидай дальше

Оффлайн evtuhovdo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 19
    • Просмотр профиля
terrible_user,
спасибо добрый человек =)
ubuntu server 10.04 lucid

Оффлайн chilly86

  • Новичок
  • *
  • Сообщений: 35
  • бука
    • Просмотр профиля
    • Мелитопольский форум
   
здравствуйте!

(Нажмите, чтобы показать/скрыть)

что я делаю не так? почему созданный этим же "седом" перенос строки не заменяется?
to live is to die

Оффлайн victor00000

  • Забанен
  • Старожил
  • *
  • Сообщений: 15570
  • Глухонемой (Deaf)
    • Просмотр профиля
cat ./999999.txt | sed 's/$/1/g'
Нельзя друзья, дулу - AnrDaemon видите?
~.o

Оффлайн chilly86

  • Новичок
  • *
  • Сообщений: 35
  • бука
    • Просмотр профиля
    • Мелитопольский форум
cat ./999999.txt | sed 's/$/1/g'

было:
(Нажмите, чтобы показать/скрыть)


стало

(Нажмите, чтобы показать/скрыть)
to live is to die

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
sed считывает построчно, поэтому перевод строки как-бы "зависает" между строками, т.е. находится после окончания 1-й строки, но не входит в следующую, поэтому простой заменой переводы строк в sed не убрать. Надо или обрабатывать 2 строки сразу (параметр N) и делать это в цикле, либо использовать другие программы (например tr). Примеры см выше.
Или такsed -n 'H;${g;s/\n//gp}'
« Последнее редактирование: 06 Октябрь 2014, 17:11:56 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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