使用sed从RTF文件中删除换行符


2

我有一个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为简洁而添加)

如您所见,已插入换行符以适合页面的宽度。当我尝试读取iPhone上的文本时出现问题,该文本具有不同的行长度。线条断裂,可读性受阻。

理想的解决方案是将文件转换为每个段落的单行,同时保留新行和新段落的缩进。

到目前为止,我已尝试使用sed解析文件,但无法创建多行正则表达式。理想情况下,我想用“”替换所有“\ r \ n”,除非下一行以空格开头。

有更好的解决方案吗?如果没有,我怎么能用sed做呢?

Answers:


3

解决方案在一个我没有认真思考的工具中撒谎 - awk

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

这将覆盖文件,\ par作为字段分隔符,并将在任何以4个空格开头的行(标记新段落的开头)之前打印\ par,并删除(或根本不打印)当它以空间开始时的任何东西。

现在我们所拥有的是一个只有合法换行符的\ par的文件。下一步将完全删除所有换行符,以摆脱流氓换行符:

tr -d '\r\n'

然后将结果提供给sed的替换\面值\帕\ r \ n,实际上增加一个新行,其中一个\面值是。

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)上可读。


2

这个正则表达式将匹配你想要的:

\r\n(?! )


所以使用sed:

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


除此之外,似乎sed不支持负向前瞻,并且需要背面的parens,因此您可以使用:

sed 's/\r\n\([^ ]\)/ \1/g' filename.rtf

sed通过一次读一行来工作。\ r \ n不符合
MoshiBin

嗯,然后使用一个工具,立即在整个文件上工作
Peter Boughton于2009年

或者这里有一个与sed进行多线的可能解决方案:ilfilosofo.com/blog/2008/04/26 / ...
Peter Boughton于2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.