在每个第80个字符之前,在最近的空格字符处使用换行符分割文件

时间:2014-09-24 15:41:49

标签: bash sed

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

我可以想到如何使用类似的东西在每80个字符处精确地拆分文件:

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

然后通过并将每个以char开头的行与前一行合并,如果它完全在非空白字符上结束,并在换行符之前的最后一个空格字符处拆分,例如:< / p>

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

但这似乎有点尴尬,而且几乎肯定是不必要的,因为我确信在bash中管理这样的任务可能更简洁。

哦,是的,文件中有很多单个短划线连字符被空格包围,因此我希望避免在紧跟一个短划线之前或之前的任何空格上进行拆分。

3 个答案:

答案 0 :(得分:4)

如果可以,我会使用fmt代替sed来换行。

fmt -w 80 file.txt

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

答案 1 :(得分:4)

您对连字符的要求对我来说并不十分清楚。通常,文本流动将在连字符后断开单词(如果文本中存在连字符),并且更好的文本格式化系统将使用字典和一些内置启发式自动连字。但是,标准的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,其中包含更多选项。

答案 2 :(得分:0)

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

只是为了好玩,fmt和其他是为了。

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