Board logo

标题: 使用命令行高效地进行文本编辑(3) [打印本页]

作者: look_w    时间: 2018-5-19 16:03     标题: 使用命令行高效地进行文本编辑(3)

使用 sed 进行编辑本文讨论的最复杂和最强大的编辑工具是 sed(流编辑器)。它是一个文本编辑器,但是与诸如 ed 等文本编辑器不同,它编辑输入流并写到输出流。因此,它对于编辑命令输出或对于使用其他工具对文件进行预处理非常有用——然后您可以将该文本通过管道直接输出给 sed,以进行快速编辑。但是 sed 还可以操作文件,并且其脚本语言具有高级模式匹配功能,因此它是用于执行任何类型的快速文本编辑的理想选择——例如对一组文件进行快速搜索和替换。事实上,它是现有用于文本编辑的最流行命令行工具之一。
sed 接受包含任何数量命令的脚本,后面跟着可选的指定输入文件的选项;缺省情况下,它读取标准输入。某些版本的 sed 有一个 -i 选项,此选项指定应该编辑的输入文件。(如果没有此选项,则读取输入文件,而不对其执行写入。)如果您安装的版本支持此选项,则应该使用它——它允许您使用单个命令对任何指定的文件执行快速编辑操作。
1
sed -i script filespec




以下示例假设您的 sed 支持 -i 选项。否则,您必须使用 Shell 重定向将输出保存到新文件,并在另一个步骤将新文件重命名为旧文件,从而执行临时文件中转:
1
sed script file > newfile; mv newfile file




对于多个文件,您必须执行循环:
1
for i in *; { sed script $i > $i.new; mv $i.new $i; }




替换文件中的文本您可以使用 s/searchstring/replacestring/ 构造将给定字符串替换为另一个字符串。若要替换某个文件中每行上的第一个 old 实例,可以使用以下命令:
1
$ sed -i 's/old/new/' file




若要替换每个实例,可以对该搜索追加 g 选项。此项技术对于修复输入错误或替换一个或一组文件中的重复单词、短语或其他内容非常理想。
1
$ sed -i 's/Esclipse/Eclipse/g' *.xml




您可以在输入表达式中将字符包括在方括号中,但是,如果您在替换文本中使用方括号,则会将它们视为普通字符:
1
2
3
4
5
6
7
8
$ 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.




当要搜索或替换的短语包括斜杠字符时,应使用它来定义新的分隔符:
1
$ sed -i 's,/usr/local/websphere,/usr/websphere,' file




您还可以将包含某个模式的整个行替换为某些新文本:
1
$ sed -i 's/.*pattern.*/LINE DELETED/' file




编辑匹配的模式回想一下在模式中将字符分组在一起的方括号示例,以及如何在替换文本中将它们视为普通字符。如果您希望在替换文本中包括字面匹配的模式,该怎么办呢?可以使用“和”号 (&) 来实现。此方法对于通过在匹配模式之前或之后放置文本来编辑匹配模式是非常有用的:
1
2
3
4
5
6
7
8
$ cat file
This is the beginning.
This is the middle.
This is the end.
$ sed 's/[Tt]h/>&</g' file
>Th<is is >th<e beginning.
>Th<is is >th<e middle.
>Th<is is >th<e end.




在匹配模式之后插入文本使用 a 命令在给定的匹配模式后面添加一行文本:
1
$ sed -i '/pattern/a text' file




这并不替换与模式匹配的文本——它只是在第一个包含该模式的行后面添加文本。
在行开头插入文本若要在每行开头插入文本,可以匹配脱字号元字符并提供要插入的文本。下面显示了如何向文件中的所有行添加电子邮件样式引用:
1
2
3
4
$ sed 's/^/> /' input.txt
> This line has trailing blanks.
> This line does not.
$




在行尾插入文本同样的原理也适用于在每行结尾插入文本——匹配美元符号元字符并提供要插入的文本。下面演示了如何模拟 AIX cat 的 -vet 选项来标记尾随空格:
1
2
3
4
$ sed 's/$/$/' file
This line has trailing blanks.   $
This line does not.$
$




删除文件中的行d 命令删除给定的行。您可以在它前面附加行号、范围、要匹配或包括在斜杠中的模式。
若要删除文件中的第一行,可以使用以下命令:
1
$ sed -i 1d file




若要删除第 1 至第 10 行,可以使用以下命令:
1
$ sed -i 1,10d file




若要删除“BEGIN QUOTE”字符串的第一个实例到“END QUOTE”字符串的第一个实例之间的所有行,可以使用以下命令:
1
$ sed -i '/BEGIN QUOTE/,/END QUOTE/d' file




若要删除当前目录中扩展名为 .xml 的所有文件中第一行包含“<record>”并且最后一行包含“"</record>"”的所有文本部分,可以使用以下命令:
1
$ sed -i '/<record>/,/<\/record>/d' *.xml




若要删除从第一行直到第一个空白行的所有内容,可以使用以下命令:
1
$ sed -i '/^> /d' file




(当在电子邮件消息或 Usenet 文章中使用时,前述单命令行程序将除去所有标头。)
若要删除所有以电子邮件样式引用开头的行,可以使用以下命令:
1
$ sed -i /^$/d file




若要删除文件的最后一行,可以使用以下命令:
1
$ sed -i '$d' file




删除尾随空格如果文件中的行包含需要清除的尾随空格字符,在文本编辑器中人工查找并删除它们会非常麻烦,但是使用 sed 完成此任务将成为一个快速的单行操作。您可以搜索行尾之前出现一次或多次的字面空格字符,并将其替换为空字符:
1
2
3
4
5
6
7
8
9
10
$ 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。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0