若要在文件开头插入另一个文件的内容,可以使用 r 命令:
$ (echo '0r headnotes'; echo 'wq') | ed file
在给定字符串之后插入文本
您可以使用 ed 将任何数量的文本行插入文件中任意行之前或之后。若要在第一个包含给定字符串的行之后插入,可以将该字符串包括在斜杠中,并在后面跟着 a 命令以追加随后的文本。与前面一样,各个行使用一个句点结束,并使用 wq 写入文件并退出。
当您希望在文件中的特定位置追加文本块时,此项技术就会派上用场:
$ ( 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,这是使用 << 和一个限制字符串以内联方式指定的文档,用于重定向其后直至到达限制字符串的所有输入(请参见参考资料):
$ for i in *.xml
> { ed -s $i << EOF
> //a \
> \
> johnnycomelately \
> 10 \
> 4 \
> \
> .
> wq
> EOF
> }
$
您可以在给定字符串之后插入一个文件:
$ (echo '/END OF PART I/r footnotes.txt'; echo 'wq') | ed file
删除行
使用 d 命令来删除文件中的行。与本文讨论的所有命令一样,您可以指定任何类型的有效地址,例如特定的行或行范围。在实践中,此单命令行程序最适合于与至少一个匹配的模式结合使用,例如删除从第一个匹配某模式的行到文件结尾的所有行:
$ ( echo '/FOOTNOTES/,$/d'; echo 'wq' ) | ed -s file
也可以按相反方向执行此操作,并删除从该文件的第一行到第一个匹配某模式的行的所有内容:
$ ( echo '1,/\.\.\./d'; echo 'wq' ) | ed -s file
删除尾随空格
通过使用 s 命令并替换一个空替换字符,您可以删除尾随空格:
$ 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.$
$
使用 sed 进行编辑
本文讨论的最复杂和最强大的编辑工具是 sed(流编辑器)。它是一个文本编辑器,但是与诸如 ed 等文本编辑器不同,它编辑输入流并写到输出流。因此,它对于编辑命令输出或对于使用其他工具对文件进行预处理非常有用——然后您可以将该文本通过管道直接输出给 sed,以进行快速编辑。但是 sed 还可以操作文件,并且其脚本语言具有高级模式匹配功能,因此它是用于执行任何类型的快速文本编辑的理想选择——例如对一组文件进行快速搜索和替换。事实上,它是现有用于文本编辑的最流行命令行工具之一。
sed 接受包含任何数量命令的脚本,后面跟着可选的指定输入文件的选项;缺省情况下,它读取标准输入。某些版本的 sed 有一个 -i 选项,此选项指定应该编辑的输入文件。(如果没有此选项,则读取输入文件,而不对其执行写入。)如果您安装的版本支持此选项,则应该使用它——它允许您使用单个命令对任何指定的文件执行快速编辑操作。
sed -i script filespec
以下示例假设您的 sed 支持 -i 选项。否则,您必须使用 Shell 重定向将输出保存到新文件,并在另一个步骤将新文件重命名为旧文件,从而执行临时文件中转:
sed script file > newfile; mv newfile file
对于多个文件,您必须执行循环:
for i in *; { sed script $i > $i.new; mv $i.new $i; }
替换文件中的文本
您可以使用 s/searchstring/replacestring/ 构造将给定字符串替换为另一个字符串。若要替换某个文件中每行上的第一个 old 实例,可以使用以下命令:
$ sed -i 's/old/new/' file
若要替换每个实例,可以对该搜索追加 g 选项。此项技术对于修复输入错误或替换一个或一组文件中的重复单词、短语或其他内容非常理想。
$ sed -i 's/Esclipse/Eclipse/g' *.xml
您可以在输入表达式中将字符包括在方括号中,但是,如果您在替换文本中使用方括号,则会将它们视为普通字符:
$ cat file
This is the beginning.
This is the middle.
This is the end.
$ sed 's/[Tt]h/[Tt]h/g' file
[Tt]his is [Tt]he beginning.
[Tt]his is [Tt]he middle.
[Tt]his is [Tt]he end.
当要搜索或替换的短语包括斜杠字符时,应使用它来定义新的分隔符:
$ sed -i 's,/usr/local/websphere,/usr/websphere,' file
您还可以将包含某个模式的整个行替换为某些新文本:
$ sed -i 's/.*pattern.*/LINE DELETED/' file
编辑匹配的模式
回想一下在模式中将字符分组在一起的方括号示例,以及如何在替换文本中将它们视为普通字符。如果您希望在替换文本中包括字面匹配的模式,该怎么办呢?可以使用“和”号 (&) 来实现。此方法对于通过在匹配模式之前或之后放置文本来编辑匹配模式是非常有用的:
$ cat file
This is the beginning.
This is the middle.
This is the end.
$ sed 's/[Tt]h/>&>Thth>Thth>Thth
在匹配模式之后插入文本
使用 a 命令在给定的匹配模式后面添加一行文本:
$ sed -i '/pattern/a text' file
这并不替换与模式匹配的文本——它只是在第一个包含该模式的行后面添加文本。
在行开头插入文本
若要在每行开头插入文本,可以匹配脱字号元字符并提供要插入的文本。下面显示了如何向文件中的所有行添加电子邮件样式引用:
$ sed 's/^/> /' input.txt
> This line has trailing blanks.
> This line does not.
$
在行尾插入文本
同样的原理也适用于在每行结尾插入文本——匹配美元符号元字符并提供要插入的文本。下面演示了如何模拟 AIX cat 的 -vet 选项来标记尾随空格:
$ sed 's/$/$/' file
This line has trailing blanks. $
This line does not.$
$
删除文件中的行
d 命令删除给定的行。您可以在它前面附加行号、范围、要匹配或包括在斜杠中的模式。
若要删除文件中的第一行,可以使用以下命令:
$ sed -i 1d file
若要删除第 1 至第 10 行,可以使用以下命令:
$ sed -i 1,10d file
若要删除“BEGIN QUOTE”字符串的第一个实例到“END QUOTE”字符串的第一个实例之间的所有行,可以使用以下命令:
$ sed -i '/BEGIN QUOTE/,/END QUOTE/d' file
若要删除当前目录中扩展名为 .xml 的所有文件中第一行包含“”并且最后一行包含“""”的所有文本部分,可以使用以下命令:
$ sed -i '//,/<\/record>/d' *.xml
若要删除从第一行直到第一个空白行的所有内容,可以使用以下命令:
$ sed -i '/^> /d' file
(当在电子邮件消息或 Usenet 文章中使用时,前述单命令行程序将除去所有标头。)
若要删除所有以电子邮件样式引用开头的行,可以使用以下命令:
$ sed -i /^$/d file
若要删除文件的最后一行,可以使用以下命令:
$ sed -i '$d' file
删除尾随空格
如果文件中的行包含需要清除的尾随空格字符,在文本编辑器中人工查找并删除它们会非常麻烦,但是使用 sed 完成此任务将成为一个快速的单行操作。您可以搜索行尾之前出现一次或多次的字面空格字符,并将其替换为空字符:
$ cat -vet input.txt
This line has trailing blanks. $
This line does not.$
$ sed -i 's/ *$//' input.txt
$ cat -vet input.txt
This line has trailing blanks.$
This line does not.$
$
总结
通过从 UNIX 命令行运行单命令行程序,可以利用多种有意义和复合的方式(无需编辑器)对文本文件进行编辑。您这样做有许多很好的理由:为了提高速度和方便性,在无法或不适合使用交互式编辑的情况下可编写脚本,有时为了对单个文件或一组文件执行复杂编辑,这些编辑操作难于甚至无法在交互式应用程序中完成。本文使用三个普遍存在的编辑工具,通过许多简单文本编辑单命令行程序阐述了这一概念:cat、ed 和 sed。
|