文本处理大杀器——sed

来源:互联网 发布:淘宝分店怎么开 编辑:程序博客网 时间:2024/05/24 01:27

说明:本文所有案例均在linux 2.6.32-642.el6.x86_64验证成功

sed

sed是一种流编辑器,是文本处理中非常常用的工具
<——> vi :一种全屏编辑器
sed所做的处理不会改变源文件的内容

语法

sed [OPTION]…PATTERN {script}[FILE]…

sed 选项 地址编辑命令 文件

选项

-i :修改源文件;
-i.bak:修改源文件的同时生成.bak结尾的备份文件;
-n:只输出匹配到的内容到终端 #默认输出模式空间的所有行;

匹配项

地址

单地址
空地址:即对全文进行处理;
N:第n行;
/PATTERN/:被正则匹配到的行;
$:表示最后一行或者锚定行尾;

步进地址
1~2:表示奇数行;
2~2:表示偶数行;

地址对
N,M:第N行到第M行;
N,+M:第N行到下M行;
/PATTERN/,N:正则匹配到的行到第N行;
/PATTERN1/,/PATTERN2/:模式1到模式2匹配到的行;

替换及其他

s/RegExp/REPLACE/g:全局替换;
#通常和分组和后向引用结合
y/abc/xyz:转换字符,一一对应转换;
w FILE:write,保存匹配到内容到FIE
r FILE:read,将文件内容读取到指定行;
q:quit,读取到匹配行之后退出;

指令 #{ }

基础命令
=:显示行号;
n:读取下一行 #不读取本行;
d:删除模式空间的内容;
p:打印模式空间的内容;
l:输出行控制符;

高级命令
D:删除上一行到模式空间,并且继续执行指令;
P:输出上一行内容;
N:读取下一行到模式空间,用\n连接上一行;
#模式空间同时读取本行和下一行;

2大空间的交换
h/H:hold,模式空间——>保持空间,复制/追加;
g/G:get,保持空间——>模式空间,复制/追加;
x:exchange,交换模式空间和保持空间内容;

实例

实例一:

这里写图片描述
以奇数行的法二为例进行说明,/tmp/sandai文件内容为1—10,共10行
原理分析:
1. 读取第一行内容1至屏幕;
2. 执行第一条指令p,打印出1到屏幕;
3. 执行第二条指令n,读取下一行内容2到模式空间;
4. 读取第三内容重复操作1~3,至读取第10行内容10到模式空间为止;
5. 至此,打印出1、3、5、7、9到屏幕;
由上我们可以看到sed是按行匹配的呀,有兴趣的宝宝可以推推其他方法哦~

变形:检查一个文本文件中某行的长度?(sed -n np FILE | wc -c)
5

实例二:

这里写图片描述法二:sed ‘$!d’ /tmp/sandai

  1. 读取下一行内容2到模式空间;
  2. 删除下一行内容2; #第一行执行完毕,无输出;
  3. 读取下一行内容3到模式空间;
  4. 删除下一行内容3; 第二行执行完毕,无输出;
  5. 重复上述操作,直至最后一行,由于无下一行,则输出10;

这里写图片描述看了上面2个实例,你可以推理下面这个例题的原理吗?来试试吧~~~
这里写图片描述

通过上面的思考和实例,我们来总结一下sed的原理:

这里写图片描述

晓得了sed的原理,下面我们来玩玩2个案例吧,案例走起····

这里写图片描述

其实,强大的sed还有一些神奇的功能功能,我们一起来看看吧,呦吼~

sed -n '$=' /etc/fstab #显示最后一行的行号

说明:“”=“”的含义是显示行号,“”$“”表示最后一行;
一般使用 cat /etc/fstab | wc -l 来实现上述功能;

这里写图片描述思考一下,
1.如果需要显示除空行外的所有行的行号呢?
2.如果需要在查找到的行前插入空行呢?
sed ‘/aa/{x;p;x}’ /tmp/sidai
大家可以自行尝试~~~

最后的最后,我们来思考一道题:

这里写图片描述

这道题有些许难度,我们一起来分析一下吧,如下:

这里写图片描述

思考:若将每行的字符逆向显示呢?