目录
一、Linux文本处理三剑客之sed
1、基本概念
sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交与式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。sed 编辑器没有破坏性,它不会修改文件,除非使用 shell 重定向来保存输出结果。默认情况下,所有的输出行都被打印到屏幕上。
2、工作原理
sed 编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结 束运行。 sed 把每一行都存在模式空间中,对这个副本进行编辑,所以不会修改或破坏原文件。
简单来说,sed编辑器是先读取一行到模式空间,再按规则匹配处理,并将结果输出到屏幕上;如果读取的这一行没有做处理也输出到屏幕上,再读取下一行;所以不会修改或破坏原文件。
sed是一种非交互式的流式编辑器,这里有两个关键字,非交互式和流式;- 非交互式就是指sed只能够在命令行下输入编辑命令来对文本进行编辑,然后在屏幕上查看输出;
- 流式是指sed每次只从文件中读入一行,然后对该行进行指定的处理,并将处理结果输出到屏幕上,处理完后再读入下一行 。
3、sed 命令的基本格式
[root@localhost ~]# sed [选项] [编辑命令] 文件名
4、常用选项
选项 含义 -e 脚本命令 该选项会将其后跟的脚本命令添加到已有的命令中。 -f<script文件>
或
--file=<script文件>
以选项中指定的script文件来处理输入的文本文件。 -n 默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。 -i 此选项会直接修改源文件,要慎用。 -r 支持使用扩展正则表达式
5、地址定界
地址定界,是sed是否执行命令的条件。
(1) 空地址:对全文进行处理;
(2) 单地址:
# 指定行;
/pattern/ 被此模式所匹配到的每一行;
(3) 地址范围
#,# 从第#行到第#行
#,+# 从#行开始,再加#行
#,/pat1/ 从#行开始,一直到匹配到的内容
/pat1/,/pat2/ 两个匹配到的内容之间
$ 在表示范围的时候表示最后一行;在替换里表示行的终止。
(4) 步进:~
1~2:所有奇数行
2~2:所有偶数行波浪号~也可以指定地址范围。它指定每次要跳过的行数。如 n~m 表示从第 n 行开始,每次跳过 (m-1) 行:
1~2 匹配 1,3,5,7......
2~2 匹配 2,4,6,8.,.....
1~3 匹配 1,4,7,10,.....
2~3 匹配 2,5,8,11,.....
6、编辑命令
- d 删除;
- p 打印模式空间中的内容(会出现两遍,sed命令本来就会输出模式空间内容,使用p 命令又会打印一遍)
- n 命令 n 打印当前模式空间的内容(只会输出一遍)
- a \text 在行后面追加文本“text”,支持使用\n实现多行追加;
- i \text 在行前面插入文本“text”,支持使用\n实现多行插入;
- c \text 把匹配到的行替换为此处指定的文本“text”;
- w /PATH/TO/SOMEFILE 保存模式空间匹配到的行至指定的文件中;
- l 打印不可见字符
- y 命令 y 根据对应位置转换字符。好处之一便是把大写字符转换为小写,反之亦然。
- q 退出 sed
- r /PATH/FROM/SOMEFILE 读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
- = 为模式匹配到的行打印行号;
- ! 条件取反;
- s/north/123/g 查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
- 替换标记:
- g 全局替换;
- w /PATH/TO/SOMEFILE 将替换成功的结果保存至指定文件中;
- p 显示替换成功的行;
- num 表示替换第几次出现的
- (比如/2 会替换每行中第 2 次出现的a为A)
- i 忽略大小写
- e
- 在使用正则表达式时有一个特殊的符号 & 表示连接的意思
7、举例
# vi sed.file northwest NW Charles Main 4.0 .99 3 35 western WE Sharon Gray 8.3 .97 5 23 southwest SW Lewis Dalsass 4.7 .8 2 19 southern SO Suan Chin 5.1 .96 4 15 southeast SE Patricia Hemenway 4.0 .7 4 16 eastern EA TB Savage 7.7 .84 5 22 northeast NE AM Main Jr. 5.1 .96 3 13 north NO Margot Weber 3.4 .87 5 8 central CT Ann Stephens 2.7 .94 5 14
# sed "/north/p" sed.file (匹配有north的每一行怕、并打印出来)
明明只打印匹配的行,为什么全都出来了?还有重复的?
sed是先读取一行,再按规则匹配处理,并将结果输出到屏幕上,再读取下一行;如果读取的这一行没有做任何处理也是输出到屏幕上,再读取下一行;所以会出现整个文件内容和符合匹配规则的行;
如果不想要没处理的行呢?
# sed -n "/north/p" sed.file
删除了模式空间的每一行,再发送出来,所以是空的;
但是查看原文件还在,所以说sed不会删除和修改源文件;
删除模式空间高亮那一行;
替换
再范围内替换
# sed "/101/,/107/s/Manager/Dr/p" employee.txt
sed也可以使用正则表达式
替换以west开头的为123;
将只有两个数字的都连接0.1
分组和引用
第一个分组是Mar 第二个分组是t 所以在替换的时候引用了第一个Mar 和第二个分组t;
# sed "s/\(Mar\)go\(t\)/\1AB\2/p" sed.file
从哪一行到哪一行
# sed "/northwest/,/eastern/p" sed.file
# sed "1,5p" sed.file
从第三行开始,再加三行 ;
# sed "3,+3p" sed.file
从第三行到最后一行
# sed "3,$ p" sed.file
范围内的替换
# sed "/northwest/,/southern/s/north/@@@/" sed.file
$的使用
在范围里表示最后一行;
# sed "3,$ p" sed.file
在替换里表示行的终止
# sed "s/$/111/" sed.file
匹配 north 到 south 之间的将行尾替换成@@ ;但因为下面只有 north 匹配不到 south 所以从这一行开始的每一行行尾都一换成了@@;
简单来说,从 north 开始就将每一行的行尾都替换成@@,直到匹配到south才会停止;
多点编辑
多点编辑就是可以连续执行多个命令;
# sed -e '2,3d' -e '/north/,/south/s/$/@@/' sed.file
a \text 在行后面追加文本“text”,支持使用\n实现多行追加;
# sed "/^north/a------" sed.file
# sed '2 a 203,Jack Johnson,Engineer' employee.txt (在第二行后面追加一行)
i \text 在行前面插入文本“text”,支持使用\n实现多行插入;
# sed "/^north/i------" sed.file
c \text 把匹配到的行替换为此处指定的文本“text”;
# sed "/^north/c------" sed.file
= 为模式匹配到的行打印行号;行号表示这一行在第几行
w /PATH/TO/SOMEFILE 保存模式空间匹配到的行至指定的文件中;
sed "匹配范围 w 保存的文件名" 原文件名
# sed "/north/ w /root/2" sed.file
注意!!在保存不同的内容到相同的文件中时,会先清空文件再保存进去;
r /PATH/FROM/SOMEFILE 读取指定文件的内容至当前文件被模式匹配到的行后面;# sed "/north/ r /root/2" sed.file
只要匹配到 north 就在后面加入 /root/2 的内容
替换时忽略大小写
y转义字符# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' employee.txt (所有小写字母转换成大写字母)
操作多个文件$ sed -n '/root/ p' /etc/passwd /etc/group (同时在/etc/passwd 和/etc/group 中搜索 root)
$ sed '3 q' employee.txt (打印第 5 行后退出,即只打印前 5 行:)