Заменить CR / LF в текстовом файле только после определенного столбца - PullRequest
3 голосов
/ 16 мая 2010

У меня есть большой текстовый файл, который я хотел бы поместить в свое устройство для чтения электронных книг, но форматирование становится неправильным, поскольку все строки жестко переносятся в столбце 80 или перед ним с CR / LF, а абзацы / заголовки не помечаются по-разному там тоже только один CR / LF.

Я хотел бы заменить все CR / LF после столбца 75 пробелом. Это сделало бы большинство пунктов непрерывными. (Не идеальное решение, но намного лучше читать.)

Возможно ли сделать это с помощью регулярного выражения? Предпочтительно (linux) perl или sed oneliner, альтернативно регулярное выражение Notepad ++.

Ответы [ 4 ]

2 голосов
/ 16 мая 2010
perl -p -e 's/\s+$//; $_ .= length() <= 75 ? qq{\n} : q{ }' book.txt

Опция Perl -p означает: для каждой строки ввода обрабатывать и печатать. Код обработки поставляется с опцией -e. В этом случае: удалите конечные пробелы, а затем добавьте новую строку или пробел, в зависимости от длины строки.

1 голос
/ 16 мая 2010

Не совсем отвечаю на ваш вопрос, но вы можете достичь этого результата в vim, используя эту команду глобального соединения. V расширяет вкладки в пробел при определении длины строки, эта функция может быть полезна в зависимости от вашего исходного текста.

:g/\%>74v$\n/j
1 голос
/ 16 мая 2010

Кажется, это довольно близко:

sed '/^$/! {:a;N;s/\(.\{75\}[^\n]*\)\n\(.\{75\}\)/\1 \2/;ta}' ebook.txt

Он не получает последнюю строку абзаца, если он короче 75 символов.

Edit:

Эта версия должна делать все это:

sed '/^.\{0,74\}$/ b; :a;N;s/\(.\{75\}[^\n]*\)\n\(.\{75\}\)/\1 \2/;ta; s/\n/ /g' ebook.txt

Редактировать 2:

Если вы хотите переупорядочить границы слов / предложений на другой ширине (здесь 65, но выберите любое значение), чтобы предотвратить разрыв слов на полях (или длинные строки обрезаться):

sed 's/^.\{0,74\}$/&\n/' ebook.txt | fmt -w 65 | sed '/^$;s/\n//}'

Чтобы перейти с конца строки в DOS на Unix, просто добавьте dos2unix в начало любого из вышеперечисленных каналов:

dos2unix < ebook.txt | sed '/^.\{0,74\}$/ b; :a;N;s/\(.\{75\}[^\n]*\)\n\(.\{75\}\)/\1 \2/;ta; s/\n/ /g'
0 голосов
/ 16 мая 2010

Менее причудливый вариант - заменить cr / lf, которые apperar, сами по себе на строку с одним lf или cr, затем удалить все оставшиеся cr / lf. Не нужно модных / сложных вещей.

регулярное выражение 1: ^\r\n$ находит одиноких кр / лф. Затем тривиально заменить оставшиеся. См. этот вопрос для получения справки по поиску cr / lf в np ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...