Удаление новых строк из файла RTF с помощью sed

У меня есть файл RTF, который отформатирован как так:

    Lorem ipsum dolor sit amet, consectetur adipiscing elit.\par
Nullam vitae sem porttitor urna pellentesque gravida. Nulla\par
consequat purus vel est vehicula porttitor.\par
    Maecenas pharetra metus in enim sollicitudin sollicitudin.\par
Etiam et odio tellus, eget placerat enim. Aliquam sem purus,\par
gravida sed feugiat eget, consectetur quis nisl.\par

(\par добавленный для краткости)

Как Вы видите, новые строки были вставлены для установки странице width. Проблема возникает, когда я пытаюсь прочитать текст на своем iPhone, который имеет другую длину строки. Повреждению строк и удобочитаемости препятствуют.

Идеальное решение было бы тем, которое преобразовывает файл в одну строку для каждого абзаца при хранении новой строки и отступа для новых абзацев.

До сих пор я попытался анализировать файл с sed, но не могло создать мультилинию regex. Идеально, я хочу заменить весь "\r\n" s "", если следующая строка не начинается с пространства.

Существует ли лучшее решение для этого? В противном случае, как я могу сделать это с помощью sed?

2
задан 22.08.2009, 07:06

2 ответа

Решение лгало в инструменте, который я не уделил серьезному вниманию - awk

awk 'BEGIN { FS="\\\\par" } ; /^    / {print "\\par" $1} /^[^ ]/ {print " " $1}'

Это пробежится через файл, с \par как полевой разделитель, и распечатает \par перед любой строкой, которая запускается с 4 пробелов (который отмечает начало нового абзаца), и удалите (или просто не распечатает), это, когда это запускается с чего-либо кроме пространства.

Теперь то, что мы имеем, является файлом с \par только там, где легальные разрывы строки должны быть. Следующий шаг должен был бы удалить все новые строки в целом, для избавлений от разрывов строки жулика:

tr -d '\r\n'

И затем подайте результат к sed для замены \par \par\r\n, практически добавив новую строку, где \par.

sed 's/\\par/\\par\r\n/g'

И сделанный.

Единственная реальная проблема, которую я нашел с этим методом, - то, что он разрушил заголовок RTF. Без проблем, я просто скопировал по заголовку из исходного файла.

Другая меньшая проблема была то, что заголовки главы печатались встроенные с предыдущими абзацами. Это вызвано тем, что заголовки главы не запускаются с пространства, все же должен считаться абзацем. В моем случае главы были отмечены как так:

ГЛАВА ТРИДЦАТЬ ДВА
Название главы

Таким образом, быстрый sed заботился о них:

sed 's/\s*\(CHAPTER [[:upper:]-]* \)\(.*\\par\)/\\par\r\n\\par\r\n\\par\r\n\1\\par\r\n\2\\par\r\n/'

У меня теперь есть своя книга в соответствующем формате, который делает ее читаемой на других устройствах (таких как мой iPod).

3
ответ дан 08.12.2019, 06:00

Этот regex будет соответствовать тому, что Вы хотите:

\r\n(?! )


Таким образом использовать это с sed:

sed 's/\r\n(?! )/ /g' filename.rtf


Кроме, кажется, что sed не поддерживает отрицательное предвидение и требует backslashed parens, таким образом, можно вместо этого использовать:

sed 's/\r\n\([^ ]\)/ \1/g' filename.rtf
2
ответ дан 08.12.2019, 06:00

Теги

Похожие вопросы