测试文件:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmo tempor incididunt ut labore et dolore magna aliqua. Ut enim minim veniam quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
如果使用
script.sh input.txt output.txt
sed 's/ - /--/g
s/ \{0,1\}[—–] \{0,1\}/--/g
s/…/.../g
s/\\\*/†/g
s/*/\//g
s/\\\././g' $1 |
fold -sw 72 |
sed 's/ *$//g' > $2
输出是
------------------------------------------------------------------------ <- 72 characters
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmo
tempor incididunt ut labore et dolore magna aliqua. Ut enim minim
veniam quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
但为什么不这样呢?
------------------------------------------------------------------------ <- 72 characters
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmo
tempor incididunt ut labore et dolore magna aliqua. Ut enim minim veniam
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim
id est laborum.
也就是说,为什么该词veniam
从第二行移到了第三行? 是不是没有足够的空间?
man fold
:
-s:在最后一个空白字符之后折叠行的第一个宽度列位置(或字节)。
我使用fold
macOS 提供的,但如果使用 GNU fold
,输出文件是相同的。
因为
fold
只是折叠。它实际上对单词一无所知,它只是有一个不错的选项来在空格处中断。但是,如果仔细查看输出,您会发现虽然它在空格处中断,但它仍将它们保留在输出中。您可以通过将行末的所有空格转换为另一个字符来查看它们,例如_
:看到
_
每行末尾的那些了吗?那些是空格。这意味着在处理此行时:我们有这么多角色:
当我们到达 时
minim
,我们在位置 66。如果我们还添加veniam
(请注意 之后的空格veniam
,这是工具被允许切割的唯一位置),这将使我们越过界限:因此,后面的空格
veniam
是第 73 个字符,并且fold
只能在最大位置 72 的空格处断开。这就是它不包括的原因veniam
。如果你允许它在任何地方发生故障,它就会这样做:
如果你想要第二个结果,而不是使用折叠,而是使用
fmt
这似乎与您的预期输出完全匹配,并且具有默认选项。