使用 ed 进行编辑顾名思义,行编辑器 ed 对输入文件的行执行编辑。它将整个文件读入自己的缓冲区,对该副本执行指定的操作,并可选地将缓冲区写到磁盘。您可以在编辑操作中指定任何数量的行,并且这些操作可以在一个序列中进行组合和指定。这些事实使得 ed 成为在脚本中使用的理想选择。以如下格式指定操作:
1
| [address]command [text]
|
address 指定要处理的一行或多行(缺省为当前行),并且可以通过多种方式进行指定。单字符的 command 是要对指定行执行的操作。对于脚本中的特别单命令行程序,可以使用 echo 将一组命令和文本管道传输给 ed,从而以非交互式的方式使用它。
1
2
| ( echo 'OPERATION'; echo 'OPERATION';
... echo 'wq' ) | ed -s FILENAME
|
如果在操作中输入文本,应该回显一个句点 (.) 来指示输入结束。最后的 wq 写入文件并退出。-s 选项使 ed 静默地操作,并禁止所有正常输出。
幸运的是,ed 的基本寻址方法和命令是相当标准化的。 描述了主要的寻址形式。 给出了命令。
表 2. 在 ed 中对行寻址选项描述.此选项对当前行寻址(缺省地址)。number此选项对第 number 行寻址。可以按逗号分隔的范围 (first,last) 对行寻址。0 代表缓冲区的开头(第一行之前)。-number此选项对当前行之前的第 number 行寻址。如果没有 number,则减号对紧跟在当前行之前的行寻址。+number此选项对当前行之后的第 number 行寻址。如果没有 number,则加号对紧跟在当前行之后的行寻址。$此选项对最后一行寻址。,此选项对第一至最后一行寻址,包括第一行和最后一行(与 1,$ 相同)。;此选项对当前行至最后一行寻址。/pattern/此选项对下一个包含与 pattern 匹配的文本的行寻址。?pattern?此选项对上一个包含与 pattern 匹配的文本的行寻址。
表 3. 主要的 ed 命令命令描述a此命令在指定的地址之后追加文本。c此命令将指定的地址更改为给定的文本。d此命令删除指定地址处的行。i此命令在指定的地址之前插入文本。q此命令在将缓冲区保存到磁盘后终止程序并退出。r file此命令读取 filespec 的内容并将其插入指定的地址之后。s/pattern/replacement/此命令将匹配 pattern 的文本替换为指定地址中的 replacement 文本。w file此命令将指定的地址写到 file。如果没有 address,则此命令缺省使用整个缓冲区。
在文件开头插入文本,第二部分通过可在脚本中使用的 ed 单命令行程序,您可以容易地在文件开头插入文本。插入操作是使用 ed 并通过 a 命令将给定文本追加到第 0 行(文件开头)来完成的:
1
2
3
4
5
6
7
| $ cat file
This is the end.
$ (echo '0a'; echo 'This is the beginning.'; echo '.'; echo 'wq') | ed -s file
$ cat file
This is the beginning.
This is the end.
$
|
您可以交互式地完成同样的任务:
1
2
3
4
5
6
7
8
9
10
11
| $ cat file
This is the end.
$ ed -s file
> 0a
> This is the beginning.
> .
> wq
$ cat file
This is the beginning.
This is the end.
$
|
若要在文件开头插入另一个文件的内容,可以使用 r 命令:
1
| $ (echo '0r headnotes'; echo 'wq') | ed file
|
在给定字符串之后插入文本您可以使用 ed 将任何数量的文本行插入文件中任意行之前或之后。若要在第一个包含给定字符串的行之后插入,可以将该字符串包括在斜杠中,并在后面跟着 a 命令以追加随后的文本。与前面一样,各个行使用一个句点结束,并使用 wq 写入文件并退出。
当您希望在文件中的特定位置追加文本块时,此项技术就会派上用场:
1
2
3
4
5
6
7
| $ ( echo '/begin/a'; echo 'This is the middle.'; \
> echo '.'; echo 'wq') | ed -s file
$ cat file
This is the beginning.
This is the middle.
This is the end.
$
|
当您对一组文件执行多行文本插入时,此项技术也非常有用。如果要插入大量的行,可以使用 here document,这是使用 << 和一个限制字符串以内联方式指定的文档,用于重定向其后直至到达限制字符串的所有输入(请参见):
1
2
3
4
5
6
7
8
9
10
11
12
13
| $ for i in *.xml
> { ed -s $i << EOF
> /<records>/a \
> <record> \
> <name>johnnycomelately</name> \
> <step>10</step> \
> <dur>4</dur> \
> </record>\
> .
> wq
> EOF
> }
$
|
您可以在给定字符串之后插入一个文件:
1
| $ (echo '/END OF PART I/r footnotes.txt'; echo 'wq') | ed file
|
删除行使用 d 命令来删除文件中的行。与本文讨论的所有命令一样,您可以指定任何类型的,例如特定的行或行范围。在实践中,此单命令行程序最适合于与至少一个匹配的模式结合使用,例如删除从第一个匹配某模式的行到文件结尾的所有行:
1
| $ ( echo '/FOOTNOTES/,$/d'; echo 'wq' ) | ed -s file
|
也可以按相反方向执行此操作,并删除从该文件的第一行到第一个匹配某模式的行的所有内容:
1
| $ ( echo '1,/\.\.\./d'; echo 'wq' ) | ed -s file
|
删除尾随空格通过使用 s 命令并替换一个空替换字符,您可以删除尾随空格:
1
2
3
4
5
6
7
8
9
10
| $ cat -vet input.txt
This line has trailing blanks. $
This line does not.$
$ (echo ',s/ *$//'; echo 'wq') | ed -s input.txt
$ cat -vet input.txt
This line has trailing blanks.$
This line does not.$
$
|
|