添加一个命令将长行分成较短的行到 ed 脚本中

添加一个命令将长行分成较短的行到 ed 脚本中

我的文档中经常有很长的行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

摘要:错误取决于

  1. #在非 GNU 中用作注释字符ed
  2. 使用 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 !somecommandGNU 。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代替或。wqQ

相关内容