• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Linux命令:sed编辑器

系统管理 彭东稳 9年前 (2015-09-01) 27221次浏览 已收录 0个评论

一、Sed简述

Sed是一种流编辑器(stream editor),也是行编辑器。它的处理机制并不是处理文本文件本身,而是每一次把文本逐行读取并载入到内存空间在内存中编辑,然后把结果输出(sed默认不编辑原文件,只对模式空间中的数据做处理结束后并显示结果)。而这个内存空间对sed而言称为模式空间、称为模式空间的原因是Sed可以指定只处理指定的行,而这些行也可以像grep做模式过滤的

二、Sed工作流程

1)当用sed命令对文本进行处理的时候,sed先读取对象的文本文件的第一行到模式空间中。

2)有内容进入“模式空间”时,sed的编辑命令对模式空间中的内容进行编辑操作(修改,替换,删除,追加,显示等等)。

3)模式空间中的内容编辑处理完成之后,sed把此内容通过标准输出(默认为显示器)打印出来,并删除模式空间中的内容。

4)第一行处理结束。从新读取第二行的内容进行处理,直到最后一行。

三、Sed使用语法

Sed的使用其实也不是很麻烦,就是Address+Command来处理指定的文本,同时可以配合选项。如下:

[OPTIONS]

[Address]

Command

修饰符:

PS:s###或s@@@跟s///一样都可以用,当有相同字符出现的时候不想转义就可以使用别的分隔符开替代。

四、正则表达式(Regexp)

正则表达式,是一门相对通用的语言。简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的;此套规则,就是所谓的正则表达式。各个语言都有各自正则表达式的内置模块,包括Linux系统中sed、awk也都是使用正则表达式。当然Python中也有对正则表达式的支持,对应的就是Python内置的re模块。

正则表达式是由普通字符(例如字符a到z)以及特殊字符(称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

  • 普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

  • 特殊字符

所谓特殊字符,就是一些有特殊含义的字符,如tes*t中的*,简单的说就是表示任何字符串的意思。如果要查找字符串中的*符号,则需要对*进行转义,即在其前加一个\,如tes\*t匹配tes*t。许多元字符要求在试图匹配它们时特别对待,若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符\放在它们前面。

  • 限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。常用有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 等等。

  • 定位符

定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。

下面表格列出了常用的正则表达式符号并给出了说明:

包含’ \ ’的特殊序列的意义如下表:

五、Sed使用案例

分组案例:Sed只显示匹配的行

Sed分组”\(\)”,就是将()之间的表达式定义为”组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用\1到\9的符号来引用。

最后来一个好玩的,文件内容如下。

通过sed处理成这个样式:

Sed语法如下:

分解成三个语句(每个语句以”;”隔离):

s///,把行中有\(GRANT .*\)的匹配出来,然后交由\1;替换,其中前面\(GRANT .*\)使用了()分组,所以后面可以直接使用\1去引用,同时添加一个”;”号并显示。

s///,把行中以\(Grants for .*\)开头的行匹配出来,然后交由– \1替换,其中前面\(GRANT .*\)使用了()分组,所以后面可以直接使用\1去引用,同时添加”– “并显示出来。

最后一个就好玩了,/–/表示匹配到有–的行就交由后面的{x;p;x;}处理,这个{x;p;x;}是sed的一个命令,其中x表示把模式空间,也就是”/–/”匹配到的行跟保留空间做替换(保留空间可以理解为一个空行);然后p表示把模式空间的内容显示出来,由于做了替换所以模式空间显示的就是一个空行;最后一个x表示把模式空间跟保留空间再做一次替换,然后显示出来,等于又把原来模式空间”/–/”匹配到的行给显示出来;最后的结果就是显示成这个样子了,匹配到的行前面加了一个空行。

<参考>

正则表达式

正则表达式30分钟入门教程


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!