仅在某列之后替换文本文件中的CR / LF

时间:2010-05-16 12:31:44

标签: regex perl sed

我有一个大文本文件,我想把它放在我的电子书阅读器上,但格式化完全错误,因为所有行都是用CR / LF在80列或之前硬包装,并且段落/标题没有标记不同,那里也只有一个CR / LF。

我想要的是用一个空格替换第75列之后的所有CR / LF。这将使大多数段落连续。 (不是一个完美的解决方案,但阅读要好得多。)

是否可以使用正则表达式执行此操作?最好是(linux)perl或sed oneliner,或者Notepad ++ regex。

4 个答案:

答案 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