我有一个大文本文件,我想把它放在我的电子书阅读器上,但格式化完全错误,因为所有行都是用CR / LF在80列或之前硬包装,并且段落/标题没有标记不同,那里也只有一个CR / LF。
我想要的是用一个空格替换第75列之后的所有CR / LF。这将使大多数段落连续。 (不是一个完美的解决方案,但阅读要好得多。)
是否可以使用正则表达式执行此操作?最好是(linux)perl或sed oneliner,或者Notepad ++ regex。
答案 0 :(得分:2)
perl -p -e 's/\s+$//; $_ .= length() <= 75 ? qq{\n} : q{ }' book.txt
Perl的-p
选项意味着:对于每个输入行,处理和打印。处理代码随-e
选项提供。在这种情况下:删除尾随空格,然后附加换行符或空格,具体取决于行长度。
答案 1 :(得分:1)
这似乎非常接近:
sed '/^$/! {:a;N;s/\(.\{75\}[^\n]*\)\n\(.\{75\}\)/\1 \2/;ta}' ebook.txt
如果段落的最后一行短于75个字符,则不会得到它的最后一行。
修改强>
这个版本应该全部完成:
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'
答案 2 :(得分:1)
并未真正回答您的问题,但您可以使用此全局连接命令在vim中实现此结果。在确定行长时,v会将制表符扩展为空格,这一功能可能会对您的源文本有用。
:g/\%>74v$\n/j
答案 3 :(得分:0)
较不花哨的选择是将自己的cr / lf替换为单个lf或cr的行,然后移除剩余的所有cr / lf。不需要花哨/复杂的东西。
正则表达式1:
^\r\n$
发现孤独的cr / lf。然后替换剩下的那些是微不足道的。有关在np ++中查找cr / lf的帮助,请参阅this question。