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 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时 ...
随机推荐
- [刷题] 435 Non-overlapping Intervals
要求 贪心算法与动态规划的关系 给定一组区间,最少删除多少个区间,可以让这些区间之间互相不重叠 给定区间的起始点永远小于终止点 示例 [[1,2],[2,3],[3,4],[1,3]], 返回1 [[ ...
- SSH自动断开连接的原因-20200323
SSH自动断开连接的原因 方法一: 用putty/SecureCRT连续3分钟左右没有输入, 就自动断开, 然后必须重新登陆, 很麻烦. 在网上查了很多资料, 发现原因有多种, 环境变量TMOUT ...
- Java反射机制 之 获取类的 方法 和 属性(包括构造函数)(Day_06)
把自己立成帆,才能招来凤. 运行环境 JDK8 + IntelliJ IDEA 2018.3 本文中使用的jar包链接 https://files.cnblogs.com/files/papercy ...
- 荷小鱼 x mPaaS | 借助 H5 容器改善 App 白屏、浏览器兼容等问题
随着5G.大数据.人工智能技术的应用,各类传统行业纷纷大力推进数字化转型升级. 而受疫情的影响,教育行业也在大幅加速线上化转型进程,各类在线教育应用也在借助各种力量拓张自己的移动端市场领域. 「荷 ...
- 微信小程序从开发到上线流程
一.微信小程序从开发到上线流程 注册小程序 1.登录微信公众平台 https://mp.weixin.qq.com 2.在微信公众平台>立即注册>小程序中注册微信小程序 3.在邮箱中激活并 ...
- Spring Boot - 自定义 Banner 图案
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 前言 ...
- C#解决WebClient不能下载https网页内容
在下载之前,执行以下代码即可: if (stUrl.Substring(0, 5) == "https") { // 解决WebClient不能通过https下载内容问题 Serv ...
- SQL SERVER常用语法记录
用于记录SQL SERVER常用语法,以及内置函数. 以下语句包含: WITH 临时表语法 ROW_NUMBER()内置函数,我一般主要是用来分页.针对于查出来的所有数据做一个数字排序 分页的BETW ...
- Echarts-2.2.7中统计出来的统计图保存为图片
今天在做一个图形报表,有个需求是要把展现的统计图保存为图片, 图形报表用的Echarts-2.2.7, 以前有用过 Echarts,记得echarts插件是可以帮助我们把统计图保存为图片的. 只是不记 ...
- TensorFlow六种激活函数
TensorFlow六种激活函数 每个神经元都必须有激活函数.神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.把它看作输入和输出之间的转换.使用适当 ...