浅谈sed
1.1 SED
1.1.1 sed是什么 :全称字符流编辑器Stream Edite
1.1.2 sed功能与版本:
1. 处理纯文本文件、日志、配置文件
2. 增删改查
3. 查看sed版本:sed --version
1.1.3 语法格式
1. sed [选项] [sed指令] [输入文件]
2. sed -i.bak 's#oldboy#oldbgirl#g' oldboy.txt
3. -i ---sed命令的参数
4. s --sed指令
5. g ---就是个修饰
1.1.4 sed命令的实行过程
1. 把内容读取到内存中(模式空间)
2. 判断是否是满足我要的条件(默认都会显示到屏幕)
3. 3. sed有个默认输出所以不加-n,都会显示到屏幕
4. 继续读取直到最后一行
1.1.5 sed常用功能
实验环境:
[root@georgekai ~]# vim person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
实例1-1 查询p(print)
1. 单行 - 行号
[root@georgekai ~]# sed -n '3p' person.txt
2. 找出包含oldboy的行
[root@georgekai ~]# sed -n '/oldboy/p' person.txt
注://中间可以写需要找的内容
3. 多行连续显示(知道行号)
[root@georgekai ~]# sed -n '1,3p' person.txt
4. 多行连续显示,显示包含oldboy的行到包含yy的行(不知道行号,模糊查找)
[root@georgekai ~]# cat person.txt|sed -n '/oldboy/,/yy/p'
5. 显示不连续的行
[root@georgekai ~]# nl person.txt |sed -n '1p;3p;4p'
注:sed或awk中,加多个命令,用分号分割(;)
实例1-2 增加
1. 在文件最后一行增加俩行
方法一:[root@georgekai ~]# echo -e "106,wuxingge,UFO\n107,lee,XO" >>person.txt
方法二:[root@georgekai ~]# nl person.txt |sed -n '$a 106,wixingge,UFO\n107,lee,XO.p'
注:1. 这里的$表示最后一行,a前面可加行号
2. a === append追加,当前行的下一行追加
3. i === insert插入,当前行的上一行插入
4. 中间的\n ,表示回车键
方法三:[root@georgekai ~]# cat >> person.txt <<EOF
EOF
实例1-3 删除
1. 单行删除
[root@georgekai ~]# nl person.txt |sed '1d' -i
2. 多行删除
[root@georgekai ~]# cat person.txt |sed '/old/,/yy/d'
root@georgekai ~]# cat person.txt|sed '1d;3d;4d;5d'
2.不显示文件的空行
方法一:[root@georgekai ~]# cat person.txt |grep -v '^$'
方法二:[root@georgekai ~]# cat person.txt |sed -n '/^$/!p'
注:!在sed中也是取反的意思
方法三:[root@georgekai ~]# cat person.txt |sed '/^$/d'
方法四:[root@georgekai ~]# cat person.txt |awk '!/^$/'
实例1-4 替换s
注:在“s###g”中遇到以#开头的条件,3个#可以用3个@代替
1. 不加小g,默认只替换每一行的第一个找到的条件
[root@georgekai ~]# sed 's#[1-9]#AAAA#' person.txt
注:后面加g,会替换每一行满足条件的所有
2. 备份
[root@georgekai ~]# sed -i.bak.$(date +%F) 'sg#old#boy#' person.txt
注:先备份源文件,在修改源文件的内容
3. sed中变量的使用
[root@georgekai ~]# x=oldboy
[root@georgekai ~]# y=oldgirl
[root@georgekai ~]# sed "s#$x#$y#g" person.txt
注:sed的使用变量需要用双引号
4. 单引号与双引号区别
[root@oldboyedu43-lnb oldboy]# echo 'I'am lee'
> ^C
[root@oldboyedu43-lnb oldboy]# echo "I'am lee"
I'am lee
[root@oldboyedu43-lnb oldboy]# echo 'I"am" lee'
I"am" lee
实例1-5 反向引用(先保护,在使用)
1. &符号的作用
[root@georgekai ~]# echo '123456' |sed -r 's#.#<&>#g'
<1><2><3><4><5><6>
注:& 表示前俩个#号中间正则匹配到的所有内容
2. 命令拼接,批量修改文件名称
创建环境:
[root@georgekai ~]# touch oldboy{01..10}.jpg
如何修改:
方法一:[root@georgekai ~]# ls oldboy*.avi|sed -r 's#(.*).avi#mv & \1.jpg#g'|bash
注:1.bash的作用,执行前面管道后输出的内容
2.& 表示前俩个#号中间正则匹配到的所有内容
3.\1 表示前面()中的内容
方法二:把以txt结尾的文件,中的txt替换成jpg
[root@georgekai ~]# rename txt jpg old*.txt
[root@georgekai ~]# ls
oldboy01.jpg oldboy04.jpg oldboy07.jpg oldboy10.jpg
oldboy02.jpg oldboy05.jpg oldboy08.jpg person.txt
oldboy03.jpg oldboy06.jpg oldboy09.jpg
格式:
rename form to file
要替换的源内容是什么 替换成什么内容 替换哪些文件
jpg avi *.jpg
1.1.6 使用sed命令的常见问题
1. -r与-i同时使用
-ri (正常):先使用扩展正则,在修改文件内容
-ir :先备份文件名为“什么什么r”的备份文件,然后在替换源文件中的内容
2. -i禁止与-n一起使用
如:sed -ni '1p' person.txt 会把源文件内容清空,只留下第一行