linux 三剑客 之 sed
# sed 是什么? # sed : 字符流编辑器 Stream Editor; sed 擅长 替换、取行等 # sed 的功能与版本: 处理纯文本文件、日志、配置文件等 增加、删除、修改、查询 sed --version # 查看 sed 版本 # sed 语法格式: sed [选项] [sed指令] [输入文件] sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt # -i --- sed命令的参数 ;sed --- sed命令,一个指令 ;g --- 小尾巴, 修饰
sed 命令的执行流程
模式空间: sed 从文件读取一行文件后存入的缓冲区 (这个缓冲区是在内存中的)
sed 常用功能:
1. 查询 2. 增加 3. 删除 4. 替换 5. 拓展
1. sed 常用功能之显示 p (print)
# 创建测试环境: cat>person.txt<<EOF 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO EOF # cat>...<<EOF...EOF 表示创建文件 ; cat>>...<<EOF...EOF 表示向文件中追加内容 [root@NEO oldboy]# cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@NEO oldboy]# # 1.1 显示某一行 [root@NEO oldboy]# sed -n '3p' person.txt # -n 表示 取消默认输出; '3p' 表示显示第3行 103,Alex,COO # 1.2 显示连续多行文本 # 显示第2行到第4行的内容,包含第2行和第4行 [root@NEO oldboy]# sed -n '2,4p' person.txt # '2,4p' 表示显示从第2行到第4行 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO # 1.3 显示包含 oldboy 的行到 包含104的行 [root@NEO oldboy]# sed -n '/oldboy/p' person.txt # '/oldboy/p' ---> 表示 包含 oldboy 的行 ;此时 该行命令 相当于 grep 'oldboy',但 grep 不能过滤范围 101,oldboy,CEO [root@NEO oldboy]# sed -n '/oldboy/,/104/p' person.txt # '/oldboy/,/104/p' ---> 包含 oldboy 的行 到 包含 104 的行 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO [root@NEO oldboy]# sed -n '/oldboy/,/^104/p' person.txt # '/oldboy/,/^104/p' ---> 表示从包含 oldboy 的行到 以104开头的行 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO # 1.4 过滤多个字符串 # 默认情况下,sed只支持基本正则表达式;sed 的 -r 参数,可以支持 扩展正则表达式 (| 和 ()) # 显示包含 oldboy 的行 或者 yy 的行 [root@NEO oldboy]# egrep 'oldboy|yy' person.txt 101,oldboy,CEO 104,yy,CFO [root@NEO oldboy]# sed -rn '/oldboy|yy/p' person.txt # -r '/oldboy|yy/p' ---> 表示 包含 oldboy 或者 yy 的行 101,oldboy,CEO 104,yy,CFO # sed 命令通过正则表达式进行过滤时,相当于 egrep # 1.5 查询指定多行 [root@NEO oldboy]# sed -n '1p;3p' person.txt # '1p;3p' ---> 第1行 和 第3行; 多行之间用 逗号 分隔 101,oldboy,CEO 103,Alex,COO [root@NEO oldboy]# sed -n '1p;2,4p;5p' person.txt # , 和 ; 搭配使用 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@NEO oldboy]# sed -n '/oldboy/p;3,5p' person.txt 101,oldboy,CEO 103,Alex,COO 104,yy,CFO 105,feixue,CIO
2. sed 常用功能之增加
# 2.1 单行增加: # 在第3行后面增加一行内容 [root@NEO oldboy]# cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@NEO oldboy]# sed '3a 103.5,Lee,UFO' person.txt # 3a 表示在第3行的后面增加一行内容,3a 后面的空格没有用,也可以不写 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 103.5,Lee,UFO 104,yy,CFO 105,feixue,CIO[root@NEO oldboy]# cat person.txt # sed '3a ' 命令并没有真正修改文件内容,如果想要真正修改文件内容,可以用 sed 的 -i 参数 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@NEO oldboy]# sed '3i 103.5,Lee,UFO' person.txt # 3i 表示在第3行的前面再增加一行内容;同理, 该命令也没有真正修改文件内容,想要真正修改文件内容也是加上 -i 参数 101,oldboy,CEO 102,zhangyao,CTO 103.5,Lee,UFO 103,Alex,COO 104,yy,CFO 105,feixue,CIO # 增加单选文本: a 参数 :追加 append,在指定行后添加一行或多行文本 i 参数 :插入 insert,在指定行前添加一行或多行文本 # 在最后一行插入: [root@NEO oldboy]# sed -n '$p' person.txt # 在 sed 命令中, $ 表示最后一行 105,feixue,CIO [root@NEO oldboy]# sed '$a 103.5,Lee,UFO' person.txt # 在最后一行插入一行内容 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 103.5,Lee,UFO [root@NEO oldboy]# sed '$a new,new,new\nold,old,old' person.txt # 在最后一行增加多行内容,用 \n 分隔 (这种方法不常用;此命令已被 cat>>...<<EOF...EOF 替代,而且在最后一行的多行追加一般用 cat>> 方法) 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO new,new,new old,old,old
3. sed 常用功能之删除
# 去除空行实战:删除最后一行 [root@NEO oldboy]# cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@NEO oldboy]# sed '$d' person.txt # 删除最后一行 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO [root@NEO oldboy]# sed '1,3d' person.txt # 删除第1行到第3行; d 表示 delete 104,yy,CFO 105,feixue,CIO # 企业案例:不显示文件中空行 [root@NEO oldboy]# vim person.txt [root@NEO oldboy]# cat -nA person.txt # cat 的 -n 参数表示显示 行号, -A 表示 显示结尾的 $ 1 101,oldboy,CEO$ 2 102,zhangyao,CTO$ 3 $ 4 103,Alex,COO$ 5 $ 6 104,yy,CFO$ 7 $ 8 105,feixue,CIO$ [root@NEO oldboy]# grep -v '^$' person.txt # grep -v 表示 排除 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@NEO oldboy]# sed '/^$/d' person.txt # sed 的 /^$/ 表示空行 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO # 另一种方法: sed 的 ! 表示 取反; 在 p d 这些参数前面加 ! [root@NEO oldboy]# sed -n '/^$/p' person.txt # 显示空行 [root@NEO oldboy]# sed -n '/^$/!p' person.txt # 排除空行 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@NEO oldboy]# [root@NEO oldboy]# sed '$!d' person.txt # '$!d' : 不删除最后一行 105,feixue,CIO