在每80个字符之前,在最接近的空白字符处使用换行符拆分文件



我想在大文本文件中读取为单行文本的每80个字符之前,在最近的空白字符处插入一个换行符。

我可以考虑如何使用这样的东西来精确地在每80个字符处分割文件

sed -ri "s/.{80}/&n/g" file.txt

然后遍历并将以字符开头的每一行与前一行合并(如果它正好以非空白字符结尾),并在换行符之前的最后一个空白字符处使用类似于的内容进行拆分

sed -ri '/[^ ]$/N;s/^(.*) ([^ ]*)n/1n2/' file.txt

但这似乎有点尴尬,几乎可以肯定是没有必要的,因为我相信在bash中可能有一种更干净的方法来管理这样的任务。

哦,是的,文件中有很多被空格包围的单点划线连字符,所以我想避免在任何后面或前面紧跟单点划线的空格上进行拆分。

我并不完全清楚您对连字符的要求。通常,文本流会在连字符后打断单词(如果文本中存在连字符),而更好的文本格式化系统会使用字典和一些内置的启发式方法自动对单词进行连字符。然而,标准Unix工具没有这些功能;他们只是像对待其他字符一样对待连字符。

如果你的文本中有连字符,但它们被空格包围,那么你(可能)希望避免在连字符之前出现换行符;我不明白你为什么不想把它放在连字符后面。在任何一种情况下,如果你想避免换行,你都需要以某种方式对文本进行预处理以避免这个问题。一种方法是将不希望用于换行的空格替换为其他字符,例如非换行空格(Unicode字符U+A0)。

例如,您可以使用这样的管道来避免在连字符之前中断

sed "s/ +-/"$'u00A0'"-/g" file.txt | fmt -w 80

或者,如果你想避免在之前或之后中断:

sed "s/ +-/"$'u00A0'"-/g;s/- +/-"$'u00A00'"/g" file.txt | fmt -w 80

如果你想在之后去掉不间断的空间:

sed "s/ +-/"$'u00A0'"-/g;s/- +/-"$'u00A00'"/g" file.txt |
fmt -w 80 |
sed $'s/u00A0/ /g'

在所有情况下,我建议使用fmt(如果可用),它不仅会在空间处回流和断线,尽量不超过最大线路长度;它还将尝试以避免出现短线的方式来做到这一点。请参阅手册页中的-g选项man fmt

如果fmt不可用,您可能需要查看python模块textwrap,它有更多的选项。

如果可用,我会使用fmt而不是sed来换行。

fmt -w 80 file.txt

(或根据需要调整线宽。)

sed ':a
s/(.{80})(.)/1³2/
tb
b
:b
s/(.*) ([^ ]*)³/1³2/
s/³/^J/^JP
s/.*n//
ta' YourFile

只是为了好玩,fmt和其他都是为之设计的。

  • 使用³作为标记,可以使用其他字符(尤其是文件中存在的字符)
  • 在80个字符的行上没有添加新行
  • 如果之前找不到空格,则强制换行为80个字符

最新更新