LINUX.ORG.RU

sed: объединить строки в абзаце

 


0

1

Прощу помощи у знатоков sed. Пусть дан текст вида

    Рыба рыба рыба рыба рыба
рыба рыба рыба рыба; рыба ры-
ба рыба рыба.
    Рыба рыба рыба рыба рыба,
рыба рыба рыба рыба?
Требуется объединить строки внутри каждого абзаца (который начинается строкой с отступом) и удалить переносы:
Рыба рыба рыба рыба рыба рыба рыба рыба рыба; рыба рыба рыба рыба.
Рыба рыба рыба рыба рыба, рыба рыба рыба рыба?

★★★★

perl -ne 'chomp; s/-$//; s/([^ ])$/$1 /; s/^ +/\n/; print'
Из недостатков: первый абзац будет иметь лишний \n, а после последнего \n не будет.

AITap ★★★★★ ()
Ответ на: комментарий от AITap

Спасибо! Убрал замену переноса пробелом:

perl -ne 'chomp; s/([^ -])$/$1 /; s/([^ ])-$/$1/; s/^ +/\n/; print'

Xenesz ★★★★ ()
Ответ на: комментарий от AITap

Мой вариант

$ cat en
    Рыба рыба рыба рыба рыба
рыба рыба рыба рыба; рыба ры-
ба рыба рыба.
    Рыба рыба рыба рыба рыба,
рыба рыба рыба рыба?
$ cat en | sed ':a; s/-$//; tb; s/$/\ /; :b; /$/N; s/\n//; ta;' | sed 's/[^\^]\ \ \ \ /\n\ \ \ /'
    Рыба рыба рыба рыба рыба рыба рыба рыба рыба; рыба рыба рыба рыба
    Рыба рыба рыба рыба рыба, рыба рыба рыба рыба? 
root@ubuntu:~/Загрузки#
anonymous ()
Ответ на: комментарий от anonymous
$ cat en | sed ':a; s/-$//; tb; s/$/\ /; :b; /$/N; s/\n//; ta;' | sed 's/\([^\^]\)\ \ \ \ /\1\n\ \ \ /'
    Рыба рыба рыба рыба рыба рыба рыба рыба рыба; рыба рыба рыба рыба.
    Рыба рыба рыба рыба рыба, рыба рыба рыба рыба?

так вернее

anonymous ()
Ответ на: комментарий от Xenesz

Пять пробелов же в начале, а я написал из расчёта в четыре.

cat en | sed ':a; s/-$//; tb; s/$/\ /; :b; /$/N; s/\n//; ta;' | sed 's/\([^\^]\)\ \ \ \ \ /\1\n\ \ \ \ /'

и вообще, как-то красивее можно сделать, сейчас например так, но косяк на обработке первой строки

cat en | sed ':a; s/-$//; tb; s/$/\ /; :b; /$/N; s/\([^\^\ ]\)\ \ \ \ \ /\1\n\ \ \ \ \ /; tc; s/\n//; :c; ta;'

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.