内容:
1.sed命令介绍
2.语法格式,常用功能
查询 增加 替换 批量修改文件名
第1章sed是什么
字符流编辑器 Stream Editor
第2章sed功能与版本
处理出文本文件,日志,配置文件等
增加,删除,修改,查询
sed --version
sed -i 修改文件内容
第3章语法格式
3.1语法格式
sed [选项] [sed指令] [输入文件]
sed -i.bak 's#oldboy#oldgril#g' oldbboy.txt
先备份在修改
-i ---sed的参数
修改
-s --sed指令
g ---小尾巴/修饰
sed 找谁 干啥
找谁----条件(查找)
干啥----命令 替换 删除 增加
3.2命令执行过程
sed 特性:默认输出
-n 取消默认输出
模式空间:内存中专门为sed腾出的一块地
第4章常用功能
4.1查询:
4.1.1#单行-行号
显示第几行
[[email protected] oldboy]# sed -n '3p' person.txt
103,Alex,COO
显示包含oldboy的行
#包含oldboy的行
[[email protected] oldboy]# sed -n '/oldboy/p' person.txt
101,oldboy,CEO
‘//’//内支持正则表达式 过滤内容
4.1.2多行 连续
找出第1到3行
sed -n‘1,3p person.ttx’
#显示包含oldboy的行到包含yy的行
[[email protected] oldboy]# sed -n '/oldboy/,/yy/p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
显示文件的第1,4,5行
[[email protected] oldboy]# sed -n '1p;4p;5p' person.txt
101,oldboy,CEO
104,yy,CFO
105,feixue,CIO
同一行多条命令用;(分号)分隔
小结:
1.行号
2.正则表达式‘//p’
3.范围‘/oldboy/,/yy/’
4.2增加
4.2.1多行增加: \n 换行符(三种方法)
1.文件的最后一行增加两行106,wuxingge,UFO107,lee,XO
1)echo
echo -e "106,wuxingge,UFO\n107,lee,XO" >>person.txt
2)cat
[[email protected] oldboy]# cat >>person.txt <
106,wuxingge,UFO
107,lee,XO
ha
3)sed 行号a在文件中某一行追加内容
[[email protected] oldboy]# sed '$a106,wuxingge,UFO\n107,lee,XO' person.txt 最后一行
a === append 追加--下一行
i ==== insert 插入-----上一行
错误
[[email protected] oldboy]# sed '2a gyf is a student\nhe's a good boy' person.txt
> ^C
三个单引号乱了
解决:单引号换双引号
删除 d 一行
4.2.2不显示文件中空行
grep -v '^$' person.txt
sed '/^$/d' person.txt
awk '!/^$/' person.txt
sed -n '/^$/!p' person.txt
!(叹号) sed awk find中表示取反
4.3替换
4.3.1不加g 将每一行中第一处匹配的字符串进行替换
[[email protected] oldboy]# cat person.txt
101,oldboy,CEO
[[email protected] oldboy]# sed 's#[1-9]#AAA#g' person.txt|egrep -v '^$'
AAA0AAA,oldboy,CEO
加g --global 每一行进行全部替换---> sed指令s的替换标志之一(全局替换)
[[email protected] oldboy]# sed 's#[1-9]#AAA#' person.txt|egrep -v '^$'
AAA01,oldboy,CEO
4.3.2sed 先备份在修改文件内容
sed -i.bak‘s#[1-9]#AAA#g’person.txt
先把文件备份为person.txt.bak
然后再修改文件内容
4.3.3变量替换 双引号识别 ### 把###之间定义变量
[[email protected] oldboy]# x=oldboy定义x y 两个变量
[[email protected] oldboy]# y=oldgirl
[[email protected] oldboy]# sed "s#$x#$y#g" person.txt$x $y 应用变量
101,oldgirl,CEO
102,zhangyao,CTO
2.后项引用
1)把匹配到的内容按规定格式形式
[[email protected] oldboy]# echo '123456'|sed -r 's#(.*)##g'
<123456>
2)引用前面匹配到的内容
[[email protected] oldboy]# echo '123456'|sed -r 's#(.*)##g'
<123456>
新方法 :&表示前面正则匹配到的内容
[[email protected] oldboy]# echo '123456'|sed 's#.*##g'
<123456>
前面每个数字都加上< >号
[[email protected] oldboy]# echo '123456'|sed 's#.##g'
<1><2><3><4><5><6>
4.4新案列:批量修改文件名 命令的拼接
把.jpg修改为.avi
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy01.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy02.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy03.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy04.jpg
-rw-r--r--. 1 root root 0 Jan 10 00:24 oldboy05.jpg
4.4.1方法一:命令拼接
[[email protected] oldboy]# ls *.jpg|sed -r 's#(.*)jpg#mv & \1avi#g'
mv oldboy01.jpg oldboy01.avi
mv oldboy02.jpg oldboy02.avi
|bash 把前面的输出交给bash(命令解释器)执行
[[email protected] oldboy]# ls *.jpg|sed -r 's#(.*)jpg#mv & \1avi#g'|bash
[[email protected] oldboy]# ls *.avi
oldboy01.avi oldboy03.avi oldboy05.avi oldboy07.avi oldboy09.avi
oldboy02.avi oldboy04.avi oldboy06.avi oldboy08.avi oldboy10.avi
小结:
1.命令拼接--解决不会循环
2.先在屏幕上拼接出目标命令--最终交给bash执行
4.4.2方法二:rename
rename from to file
你要替换的内容 替换成什么 替换哪些文件
jpg avi *.jpg
[[email protected] oldboy]# rename jpg avi *.jpg
[[email protected] oldboy]# ls *.avi
oldboy01.avi oldboy03.avi oldboy05.avi oldboy07.avi oldboy09.avi
oldboy02.avi oldboy04.avi oldboy06.avi oldboy08.avi oldboy10.avi
sed用法小结:
1.排除!
2.特殊符号===获取行号=
3.一条sed语句执行多条命令;
4.5sed命令常见的坑-ri和-ir
4.5.1-r与-i同时使用
***-r参数必须在前面
-ri
正常
-ir
先把文件备份为xxxr
然后再替换文件中的内容
4.5.2-i禁止与-n一起使用
会把原文件内容清空
原文:http://blog.51cto.com/13517084/2069075