32、sed命令详解
32.1、sed介绍:
1、sed(sed软件常称做)是流编辑器,是操作、过滤、和转换文本内容的工具;
2、sed的模式空间和保持空间介绍:
(1)模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间;
1)模式空间命令:
-n:清空当前的模式空间,然后读入下一行;
-N:不清空当前的模式空间,然后读入下一行
2)模式空间中的内容为:
1\n101,oldboy,CEO
2\n102,zhangyao,CTO
(2)保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,
而是需要sed命令来进行处理(了解即可);
(3)模式空间与保持空间的关系:
1)模式空间:相当于流水线,文本行在模式空间中进行处理;
1)保持空间:相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,
但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。
32.2、语法格式:
sed [option] [sed-commands] [input-file]
sed [选项] [sed命令] [输入文件]
sed 可以从管道中获取文件
sed 处理文件的流程(串行的处理):
、
32.3、sed选项:
-n:标准化输出,只取包含内容的值,通常连"p"一同使用,常用于打印匹配的内容,
否则不匹配的内容也会显示出来(grep匹配自带此功能),只能和-r参数同时使用;
-r:正则表达式规则,只能用于分组替换;
-i:修改文件,只能和-r参数同时使用,且使用时没有输出;
32.4、sed命令:
1、指定sed执行的地址范围:
(1)数字范围:
10{sed-commands} #对第十行进行操作;
10,20{sed-commands} #对第十行到20行进行操作;
10,+20{sed-commands} #对第10行到30行进行操作;
1~2{sed-commands} #奇数行,步长为2;2~2#偶数行;
1~${sed-commands} #第一行到最后一行;
(2)正则匹配:
/oldboy/{sed-commands} #匹配字符串操作;
/oldboy/,/Alex/{sed-commands} #匹配指定的字符串到指定的字符串
(3)两者混合:
1,/oldboy/{sed-commands} #匹配行数和字符串操作;
2、命令参数:
a:追加文本到指定的行后
i:插入文本到指定的行后
d:删除指定的文本或指定的行;
s#源值#替换值#g
s #代表替换指定的字符串;
g #代表命令的替换标志——全局替换标志;
# #表示定界符,也可以使用"/",但是不好区分,最好是使用"#",方便区分;
进行全局字符串匹配的替换
c:替换 ,不常用,了解;
[root@centos6 ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
32.5、sed命令操作:
以下的操作都是在sed模式空间中进行,不会对磁盘上的文件进行实际的操作;
sed的模式空间即是,sed在内存中分配的缓存空间;
1、追加:
(1)单行追加:
[root@centos6 ~]# sed '2a 106,dandan,CSO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)多行追加:
[root@backup scripts]# sed '2a 106,dandan,CSO\n107,dandan1,CEO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
107,dandan1,CEO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed '2a 106,dandan,CSO\
> 107,dandan1,CEO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
107,dandan1,CEO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
2、插入:
(1)单行插入:
[root@centos6 ~]# sed '2i 106,dandan,CSO' person.txt
101,oldboy,CEO
106,dandan,CSO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)多行插入:
[root@backup scripts]# sed '2i 106,dandan,CSO\n107,dandan1,CEO' person.txt
101,oldboy,CEO
106,dandan,CSO
107,dandan1,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
3、删除:
(1)单行删除:
[root@centos6 ~]# sed '2d' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)多行删除:
[root@backup scripts]# sed '2,3d' person.txt
101,oldboy,CEO
104,yy,CFO
105,fcixuc,CIO
4、替换:
替换标志: g:全局标志;数字标志:1 2 3 4;写标志:w;忽略大小写标志:i ;bash 执行标志:e
(不加参数代表每一行)s# # #(不加参数表示第一个字符,g代表整行的字符) :代表对每一行的第一个字符进行匹配替换;
(1)替换文本内容:
1)全局替换:
[root@centos6 ~]# sed '2s#zhangyao#lc#g' person.txt
101,oldboy,CEO
102,lc,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
2)非全局替换:
Ms# # #Ng
# Ms g 对第二行进行全部替换;
[root@backup scripts]# sed "2s#1#0#g" num.txt
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1
1 1 1 1 1
#Ms 对第二行的第一字符进行匹配替换;
[root@backup scripts]# sed "2s#1#0#" num.txt
1 1 1 1 1
0 1 1 1 1
1 1 1 1 1
1 1 1 1 1
#s 对全局的每行的第一个字符进行匹配替换;
[root@backup scripts]# sed "s#1#0#" num.txt
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
0 1 1 1 1
#Ms Ng 对第2行从第2处以后的内容进行匹配替换;
[root@backup scripts]# sed "2s#1#0#2g" num.txt
1 1 1 1 1
1 0 0 0 0
1 1 1 1 1
1 1 1 1 1
#Ms N 对第2行从第2处进行匹配替换;
[root@backup scripts]# sed "2s#1#0#2" num.txt
1 1 1 1 1
1 0 1 1 1
1 1 1 1 1
1 1 1 1 1
#忽略大小写’i‘参数;
[root@backup scripts]# sed 's#ce#lc#g' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed 's#ce#lc#ig' person.txt
101,oldboy,lcO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)替换变量:
[root@backup scripts]# vim sed.txt
a
b
a
[root@backup scripts]# x=a
[root@backup scripts]# y=b
[root@backup scripts]# echo $x $y
a b
#需要使用双引号,因为单引号是所见即所得,不能够使用变量;
[root@backup scripts]# sed "s#$x#$y#g" sed.txt
b
b
b
(3)分组替换\(\) \1...\9 :
把全局中取到第一行的oldboy替换成取到的oldboy值;
[root@backup scripts]# vim sed1.txt
i am oldboy teacher
i am oldboy teacher
[root@backup scripts]# sed -r '1s#^.*am ([a-z].*) tea.*$#\1#g' sed1.txt
oldboy
i am oldboy teacher
[root@backup scripts]# sed -nr '1s#^.*am ([a-z].*) tea.*$#\1#gp' sed1.txt
oldboy
#特殊符号&代表被替换的内容:
[root@backup scripts]# sed -r '1,3s#(.*)#--&--#g' person.txt
--101,oldboy,CEO--
--102,zhangyao,CTO--
--103,Alex,COO--
104,yy,CFO
105,fcixuc,CIO
(4)sed的大小写替换方式:
1)参数说明:
\u \U:大写;\l \L:小写;\E:和前面的参数一起使用,代表关闭L\l,U\u的功能;
2)应用实例:
[root@backup scripts]# sed "s#oldboy#\Ulc#g" person.txt
101,LC,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed "s#oldboy#\LLC#g" person.txt
101,lc,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# sed "s#oldboy#\L\ELC#g" person.txt
101,LC,CEO #LC还是大写的,没有将LC转化为小写,因为使用\E参数;
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
5、标准化输出(查询):
(1)只显示匹配的内容 -n p
[root@backup scripts]# sed -n '/oldboy/,/Alex/p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
(2)打印奇数行:
[root@backup scripts]# sed -n '1~2p' person.txt
101,oldboy,CEO
103,Alex,COO
105,fcixuc,CIO
(3)sed模拟cat命令:
[root@backup scripts]# sed '' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(4)sed模拟grep命令:
1)普通模拟:
[root@backup scripts]# sed -n '/oldboy/ p' person.txt
101,oldboy,CEO
2)模拟grep -v:
[root@backup scripts]# sed -n '/oldboy/ !p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(5)模拟head命令:
[root@backup scripts]# sed -n '1,2p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
[root@backup scripts]# sed '2q' person.txt #读取到第二行是停止;
101,oldboy,CEO
102,zhangyao,CTO
(6)sed命令模拟wc命令:
[root@backup scripts]# sed -n '$=' person.txt
5
(7)显示空和末尾,以$符号进行显示:
[root@backup scripts]# sed -n 'l' person.txt
101,oldboy,CEO$
102,zhangyao,CTO$
$
103,Alex,COO$
104,yy,CFO$
105,fcixuc,CIO$
6、sed的其它用法:
(1)修改文件时进行源文件的备份:
[root@backup scripts]# sed -i.bak 's#oldboy#lc#g' person.txt
[root@backup scripts]# cat person.txt
101,lc,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# cat person.txt.bak
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(2)把文件修改后的内容另存为:
此方法可以使用-n -p -i -i.ori 选项;
[root@backup scripts]# sed 's#oldboy#lc#g;w ouput.txt' person.txt
101,lc,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
[root@backup scripts]# cat ouput.txt
101,lc,CEO
备注:
此方法可以对文件进行备份:
sed 'w ouput.txt' person.txt
(3)等于(=)号:
[root@backup scripts]# sed '=' person.txt
1
101,oldboy,CEO
2
102,zhangyao,CTO
3
103,Alex,COO
4
104,yy,CFO
5
105,fcixuc,CIO
#以上的形式不好看,所以改变方式为:
[root@backup scripts]# sed '=' person.txt | sed 'N;s#\n# #g'
1 101,oldboy,CEO
2 102,zhangyao,CTO
3 103,Alex,COO
4 104,yy,CFO
5 105,fcixuc,CIO
[root@backup scripts]# sed '1,2=' person.txt | sed 'N;s#\n# #g'
1 101,oldboy,CEO
2 102,zhangyao,CTO
103,Alex,COO 104,yy,CFO
105,fcixuc,CIO
(4)合并两个文件:
[root@backup scripts]# sed '$r num.txt' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
#在person.txt的第二行后面插入mum.txt的所有内容;
[root@backup scripts]# sed '2r num.txt' person.txt
101,oldboy,CEO
102,zhangyao,CTO
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
103,Alex,COO
104,yy,CFO
105,fcixuc,CIO
(5)一条sed语句执行多条sed命令:
#删除第三行到末尾的内容,并将第一行的oldboy替换成lc;
[root@backup scripts]# sed '3,$d;1s#oldboy#lc#g' person.txt
101,lc,CEO
102,zhangyao,CTO
7、企业案例:
(1)对ssh进行优化:
sed -i '13i Port 52113\nListenAddress 172.16.1.61:52113\nPermitRootLogin no\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no' /etc/ssh/ssh_config
(2)删除某一个字符或查询一个字符串,完全匹配字符串;
[root@backup scripts]# cat a.txt
oldboy
lc
#'/\<oldboy\>/'表示一个文本中单行内只有该字符串,可以匹配多个;/var/ 同样适用于grep;
[root@backup scripts]# sed -i '/\<oldboy\>/d' a.txt
[root@backup scripts]# sed -n '/\<oldboy\>/p' a.txt
(3)修改selinux的值:
sed -i `s#SELINUX=enforcing#SELINUX=disabled#g` /etc/selinux/config
sed -i `7s#enforcing#disabled#g` /etc/selinux/config
(4)批量重命名文件:
[root@backup test]# f=4e5a725a_finished.html
[root@backup test]# mv $f `echo $f | sed 's#_finished.html#.jpg#g'`
[root@backup test]# cat c23.sh
#!/bin/sh
for f in `ls /server/scripts/test/*.html`; do
mv $f `echo $f | sed "s#_finished.html#.jpg#g"`
if [ $? -ne 0 ]; then
echo $f >>/tmp/error.log
fi
done
(5)linux启动选项优化:
[root@backup scripts]# chkconfig --list | grep 3:启用 | egrep -v "sshd|crond|network|rsyslog|sysstat" | awk '{print $1}' | sed -r 's#(.*)#chkconfig \1 off#ge' # |base
#g参数可以不加,表示匹配每一行的第一个字符;
(6)一个文件100行,把5,35,70行拿出来用一条命令;
[root@backup scripts]# sed -n '5p;35p;70p;' /etc/services
# IANA services version: last updated 2009-11-10
qotd 17/tcp quote
whois++ 63/udp
(7)把上行和下行的内容用“=”连接;
[root@backup scripts]# vim svn.txt
stu1\n
1\n
stu2\n
2\n
stu3\n
3\n
stu4\n
4\n
stu5\n
5\n
[root@backup scripts]# sed 'N;s#\n#=#g' svn.txt
stu1=1
stu2=2
stu3=3
stu4=4
stu5=5
32、sed命令详解的更多相关文章
- Linux学习之sed命令详解
概述 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区 ...
- sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10 ...
- 【转】【Linux】sed命令详解
sed命令详解 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令 ...
- 转 linux之sed命令详解
http://jingyan.baidu.com/article/fec4bce2228f60f2618d8bb0.html sed 编辑裁剪文件命令 sed -i "s/\/db\/te ...
- sed命令详解 (转载)
sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内 ...
- Linux shell sed 命令详解
详细的sed命令详解,请参考https://my.oschina.net/u/3908182/blog/1921761 sed命令常见用途 查找关键词做全局替换 查找某行的关键词做替换 查找关键字所在 ...
- 【文本处理命令】之sed命令详解
sed行处理命令详解 一.简介 sed命令是一种在线编辑器.一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的,它一次处理一行内容.处理时,把当前处 ...
- linux sed命令详解
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...
- sed命令详解
搜索 纠正错误 添加实例 sed 功能强大的流式文本编辑器 补充说明 sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...
随机推荐
- [bug] SpringBoot 集成 jsp,访问时页面报Whitelabel Error Page
参考 https://bbs.csdn.net/topics/392187702
- MySQL给某个用户给某个库表设置权限
-- 用root(最高权限的用户)进行以下操作-- 创建数据库:emc_power CREATE DATABASE emc_power DEFAULT CHARACTER SET utf8 COLLA ...
- Zabbix 架构
Zabbix 架构 1.Zabbix Server Zabblx server是agent程序报告系统可用性.系统完整性和统计数据的核心组件,是所有配置信息.统计信息和操作数据的核心存储器. 2.Za ...
- Mysql数据库基础增删改查常用语句命令
Mysql增删改查常用语句命令 一.增删改查语句总览 创建: create(创建数据库) 增:insert(插入表数据) 删:drop.delete(删除表.删除表数据) 改:update.alter ...
- H5开发基础之像素、分辨率、DPI、PPI
H5开发基础之像素.分辨率.DPI.PPI html5 阅读约 4 分钟 2016-09-03于坝上草原 背景知识: 目前绝大部分显示器都是基于点阵的,通过一系列的小点排成一个大矩形,通过每个小 ...
- Ubuntu 获取升级信息失败。可能网络有问题
升级Ubuntu系统时遇到的这个问题, 原因是默认的源不是国内的,而且还可能导致下载慢等问题. 1.备份源 cd /etc/apt/ sudo cp sources.list sources.list ...
- zabbix监控之用户及用户组
一.概述 Zabbix 中的所有用户都通过 Web 前端去访问 Zabbix 应用程序.并为每个用户分配唯一的登陆名和密码. 所有用户的密码都被加密并储存于 Zabbix 数据库中.用户不能使用其用户 ...
- Chrome版本与chromedriver版本映射表
chromedriver版本 支持的Chrome版本 v2.36 v64-66 v2.35 v62-64 v2.34 v61-63 v2.33 v60-62 v2.32 v59-61 v2.31 v5 ...
- Freemaker生成复杂样式图片并无文件损坏的excel
Freemaker生成复杂样式图片并无文件损坏的excel 参考Freemarker整合poi导出带有图片的Excel教程,优化代码实现 功能介绍:1.支持Freemarker导出Excel的所有功能 ...
- 大型图像数据聚类匹配:ICCV2019论文解析
大型图像数据聚类匹配:ICCV2019论文解析 Jointly Aligning Millions of Images with Deep Penalised Reconstruction Conge ...