我的文档中经常有很长的行ed
,我想将其分成最大长度的单独行。我发现这个命令可以实现这一点:
fold -s -w80 file
我也可以从 ed 内部应用此命令,如下所示:
!fold -s -w80 %
但是,当我将此命令添加到我的 ed 脚本(其中包含以下几行)时,
g/\(‘‘\|’’\)/s//"/g
g/\(“\|”\)/s//"/g
g/\(‘\|’\)/s//'/g
g/\*/s///g
g/^#.*: /s///g
g/^ */s///
g/ *$/s///
g/ */s// /g
e !uniq %
e !fold -s -w80 %
# g/^$/d
w
Q
我收到一个错误。我想知道错误的原因以及规避方法。
答案1
摘要:错误取决于
#
在非 GNU 中用作注释字符ed
。- 使用 GNU 编辑命令的输出而不先保存缓冲区
ed
。
还:
H
是一个非常有用的命令,可以放在编辑脚本的顶部。
使用 GNU ed
,当我在一个只有一行内容的简单文件上尝试时,您的编辑脚本将毫无问题地运行hello world
。在我的 OpenBSD 系统上使用本机时ed
,我收到错误?
。
将该命令添加H
到编辑脚本的顶部,我们会启用更详细的错误。添加完该内容后,OpenBSDed
抱怨编辑脚本中的第 12 行,说unknown command
。
第 12 行(当H
已添加为第 1 行时)是命令
# g/^$/d
in#
不是标准ed
命令,但 GNUed
似乎将其视为注释。 BSDed
不:
$ printf '%s\n' H '# hello' Q | ed -s
?
script, line 2: unknown command
$ printf '%s\n' H '# hello' Q | ged -s
(无输出)
所以一错误的原因可能是您使用的命令ed
不能理解#
为有效命令。要规避它,请不要在编辑脚本中使用此命令。
标准ed
没有办法忽略给它的命令(没有“注释命令”)。
另一个可能出现错误的原因是,当缓冲区已被编辑但未保存时,您尝试使用e !somecommand
GNU 。ed
H
再次,在编辑脚本的顶部添加了一个,但现在使用了之前的一些命令修改过的文档e !uniq %
:
$ ged -s file <script
?
script, line 10: Warning: buffer modified
使用该-s
选项时,BSD在运行缓冲区中未保存的更改ed
之前不会发出警告。e !somecommand
uniq
如果您编辑和的输出fold
,则必须确保首先将编辑缓冲区写入磁盘!您需要这样做,因为 和 都fold
作用uniq
于磁盘上的文件。
因此w
在它们之前插入:
g/\(‘‘\|’’\)/s//"/g
g/\(“\|”\)/s//"/g
g/\(‘\|’\)/s//'/g
g/\*/s///g
g/^#.*: /s///g
g/^ */s///
g/ *$/s///
g/ */s// /g
w
e !uniq %
w
e !fold -s -w80 %
w
Q
你也可以将uniq
和组合fold
成
w
e ! uniq % | fold -s -w80
另请注意,BSD 和 GNU 都ed
支持非标准wq
代替或。w
q
Q