LINUX.ORG.RU

форматирование txt-книг


0

0

Имются книги простого txt формата.

В них длина строки составляет 77 символов, а в начале абзаца - 6 пробелов.

Хочется убрать эти самые ненужные переносы строк переносы строк и пробелы в начале абзаца.

Как я понимаю, сделать это можно с помощью sed, но с его синтаксисом разбираться я буду долговато )-:

Прощу помощи у сообщества.

С lib.ru что ли?

Так lib.ru умеет отдавать уже в нужном тебе формате.

sin_a ★★★★★ ()

sed -i 's/^ *//g' книга.txt
Совет: потренируйтесь на начала «на кошках», а то вдруг я опечатался.

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

ммм.. как я понимаю, эта команда удаляет только пробелы вначале? А как же переводы строк?

tishka87 ()
Ответ на: комментарий от sin_a

куча книг уже скачана с разных источников. качать заново - не вариант)

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

>куча книг уже скачана с разных источников. качать заново - не вариант)

В наш просвящённый век проще выкачивать по мере надобности в современном формате, чем качать когда-то что-то скопом и потом, годы спустя, мучиться с конверсией.

...

А по сабжу: что-то в духе:

cat book.txt | sed -r 's/^\s+/\n/g' > book-filtered.txt

А ещё лучше - поискать читалку, которая подобное деление сама понимает.

KRoN73 ★★★★★ ()

Прогоняем все текстовые файлы этим скриптом. Можно, кстати, его немного изменить, чтобы добавлялся заголовок и /end{document}

#!/bin/sh
# Заменяет обычные кавычки на "лапки"
# Кроме того производит некоторую дополнительную подготовку обычного текстовика для ЛаТеХа
tmp=/tmp/forlatex.$$
for file in $*
do
    if [ "$1" != "./" -a "$1" != "../" ]; then
    cat $1 | sed "s/\(\"\)\([^\ ?\.,:\!;]\)/<<\2/g" | sed "s/\"/>>/g"|\
	sed "s/\.\.\./\\\ldots\ /g" | sed "s/-\ /\"---\ /g" | sed "s/&/\\\&/g" |\
	sed "s/\\$/\\\\$/g" | sed "s/\^/\\\^/g" | sed "s/_/\\\_/g" > $tmp
    mv $tmp $1
    fi
shift
done
Затем компилируем pdflatex'ом и получаем нормальный pdf.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от tishka87

Тогда более костыльное решение (не знаю sed достаточно для удаления лишних переводов строк):

for file in *txt
do
tmp="$(mktemp temptext.XXXXXX)"
perl -ne 'chomp; s/^ *//g; print; print " "' < "$file" > "$tmp"
mv "$tmp" "$file"
done
AITap ★★★★★ ()

Сегодня у меня tcl-ное настроение :-)

#!/usr/bin/tclsh

foreach ifile $argv {
    set inp [open $ifile r]
    set cont [split [read $inp] \n]
    close $inp

    set outp [open $ifile w]
    foreach ln $cont {
        if {[string match {      *} $ln]} {
            puts $outp {}
            regsub {      } $ln {} ln
        }
        puts -nonewline $outp $ln
    }
    puts $outp {}
    close $outp
}

перезаписывает все файлы переданные в командной строке
app.tcl file1.txt file2.txt file3.txt ...

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

> Тогда более костыльное решение (не знаю sed достаточно для удаления лишних переводов строк)

хм! почти то, что нужно. но здесь удаляются все переводы строк, а необходимо только те, что в середине абзаца.

tishka87 ()
Ответ на: комментарий от sdio

> Сегодня у меня tcl-ное настроение

То же самое) удаляет абсолютно все переносы строк)

Что радует, так это активность сообщества! Заранее выношу всем благодарности.

tishka87 ()
Ответ на: комментарий от KRoN73

"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message

Прошу прощения, что комментирую здесь и не по теме. К сожалению в исходной теме уже нельзя комментировать. А с ходу Вас нашёл в этой теме.

Интересует развитие и финал Вашей проблемы по теме: «echo 0 > /proc/sys/kernel/hung_task_timeout_secs» disables this message

Дело в том, что у меня возникла подобная проблема, но на встраиваемом железе, которое так просто заменить и проверить нельзя.

У меня оно проработало 85 суток, а затем хряпнулось, после этого с такими-же регулярными ошибками основные задачи останавливаются. Точнее одна из задач зацикливает, причём не самая приоритетная, а остальные, более приоритетные, просто становятся.

Для возврата по гарантии нужно как-то проблему доказать.

rom_as ()
Ответ на: комментарий от tishka87

Тогда:
perl -ne 'chomp; s/^ *//g; print; print " "; print «\n» if $_ eq «„' < “$file» > «$tmp»

AITap ★★★★★ ()

>Интересует развитие и финал Вашей проблемы по теме

Ситуация сразу стала ясной после того, как я взял в точности такое же железо для другого проекта, где оно сразу же заработало без единого нарекания на тех же настройках. Потом было много переписки с производителем, один отвоз сервера на тестирование (всё было ок), но, поскольку при наличии второго работающего сервера той же конфигурации говорило о проблемах железа однозначно, то сервер мне поменяли целиком. Правда, на другую модель (такие же, что бы - отсутствовали). С тех пор всё работает без сбоев.

KRoN73 ★★★★★ ()

УРА!

Громадное спасибо, господа!

Совместив несколько решений, всё заработало.

Ниже предлагаю окончательный, но _жутко_ кривой скрипт:

#!/bin/bash

txt=$1

#сохраняет оригинал как orig_имя_файла

cp $txt orig_$txt

#создаёт tmp-файл

tmp=«$(mktemp temptext.XXXXXX)»

#удаляет пробелы в начале абзаца и добавляет символ перевода строки

cat $txt | sed -r 's/^\s+/\n/g' > $tmp

cp $tmp $txt

#удаляет лишние символы новой строки

perl -ne 'chomp; s/^ *//g; print; print " "; print «\n» if $_ eq «„' < “$txt» > «$tmp»

#удаляет повторяющиеся пробелы

cat «$tmp» | tr --squeeze-repeats ' ' > $txt

#удаляет повторяющиеся символы "-"

cat «$txt» | tr --squeeze-repeats '-' > $tmp

#заменяет источник

mv «$tmp» «$txt»

Осталось понять, как этот кошмар работает)

Ещё раз всем огромное спасибо.

tishka87 ()

Версия с sed'ом

cat file | sed ':a N;s/\n/ /;b a;' | sed ';s/       /\n/g; s/  / /g' | sed -r 's/^ *//' 
:a создает метку под именем а
N читает следующую строчку
s/\n/ / меняет перенос строки на пробел
b a переходит на метку а
s/ /\n/g меняет семь пробелов на перенос строки
s/ / /g меняет два пробела на один
s/^ *// удаляет пробелы из начала строки

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