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

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

我有一个 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 上阅读文本时,问题就出现了,因为 iPhone 的行长与 iPhone 不同。行会断开,可读性会受到影响。

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

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

有没有更好的解决方案?如果没有,我该如何使用 sed 来实现?

答案1

解决方案在于一个我还没有认真考虑过的工具 -awk

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

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

现在我们得到的是一个只在合法换行符应该出现的地方使用 \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)上阅读。

答案2

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

\r\n(?! )


因此要与 sed 一起使用它:

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


但看起来sed 不支持负向前瞻,并且需要反斜杠括号,因此您可以改用:

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

相关内容