文档目录
一、sed-简介
1、shell对文件操作介绍
2、sed命令简介
3、sed语法: sed [options] \'{command}{flags}\’ [filename]
二、sed-命令选项( -e ; -f ; -n ; -i ; -i.bak ; -r ; ! )
1、-e:将脚本中指定的一个或多个命令添加到处理输入时执行
2、-f:将文本中指定的命令添加到处理输入时执行的命令中
3、-n:抑制自动输出
4、-i:编辑文件内容
5、-i.bak:修改同时创建.bak备份源文件
三、sed-内部命令( a ; i ; p ; d ; s ; c ; y )
1、a :在匹配后面添加
2、i :在匹配前面添加
3、p :打印
4、d :删除
5、s :查找替换
6、c :更改
7、y :转换
四、sed-flags( 0-9 ; g ; p ; w filename)
1、数字:表示新文本替换的模式
2、g :表示用新文本替换现在文本的全部实例
3、p :表示打印原始的内容
4、w filename :将替换的结果写入文件
五、sed-小技巧
1、$统计文本有多少行
2、-r正则统计
3、^每行开头插入内容
4、$每行结尾追加内容
5、删除空行:/^$/d
6、删除空格:s/ *//g
7、查看/删除-注释行或空行
– – – – – – – – – — – – – – – – – – — – – – – – – – – – 分隔符- – – – – – – – – — – – – – – – – – — – – – – – – – – — – – –
一、sed-简介
1、shell对文件操作介绍
shell脚本编写中,会用到对文件的相关操作,如:增加内容,修改内容,删除部分内容,查看部分内容等,但是上述举例的这些操作一般都是需要文本编辑器中才能操作,常用的文本编辑器如:gedit、vim、nano等交互式文本编辑器,脚本无法自己独立完成,必须有人参与才可以完成,如果这样的话违背了我们编写脚本的初衷(全部由机器完成,减少人的工作压力,提升工作效率),如何才能让这些操作全部脚本自己搞定,而不需要人的参与。
为了解决上述问题,liunx为大家提供了一些命令,比如Perl、sed等命令,今天我就着重为大家介绍一下sed命令
2、sed命令简介
sed是liunx中提供的一个外部命令,它是一个行编辑器,非交互式的对文件内容进行增删改查的操作,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。它和文本编辑器是有本质的区别:
文本编辑器:编辑对象是文件,一次处理一个文本
行编辑器:编辑的对象是文件中的行,一次处理文本中一行
3、sed语法:sed [options] \'{command}{flags}\’ [filename]
二、sed-命令选项(-e ; -f ; -n ; -i ; -i.bak ; -r ; ! )
[root@localhost test20210807]# cat data1 #初始化数据1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
1、-e :将脚本中指定的一个或多个命令添加到处理输入时执行
[root@localhost test20210808]# sed -e \'3s/dog/cat/;s/brown/green/\' data1 #同时替换2个内容:dog->cat;brown->green1 the quick green fox jumps over the lazy dog.2 the quick green fox jumps over the lazy dog.3 the quick green fox jumps over the lazy cat.4 the quick green fox jumps over the lazy dog.5 the quick green fox jumps over the lazy dog.
2、-f :将文本中指定的命令添加到处理输入时执行的命令中
[root@localhost test20210808]# cat script20210808 #命令在脚本内一个命令写一行3s/dog/cat/s/brown/green/[root@localhost test20210808]# sed -f script20210808 data1 #传递文本中命令执行1 the quick green fox jumps over the lazy dog.2 the quick green fox jumps over the lazy dog.3 the quick green fox jumps over the lazy cat.4 the quick green fox jumps over the lazy dog.5 the quick green fox jumps over the lazy dog.
3、-n:抑制自动输出
[root@localhost test20210808]# sed -n \'3s/dog/cat/p\' data1 #将第3行第一个dog替换为cat,只打印次行,抑制自动打印3 the quick brown fox jumps over the lazy cat.
4、-i:编辑文件内容
[root@localhost test20210808]# sed -i \'3s/dog/cat/\' data1 #修改源文件,不输出[root@localhost test20210808]# cat data11 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy cat.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
5、-i.bak:修改同时创建.bak备份源文件
[root@localhost test20210808]# sed -i.bak \'3s/dog/cat/\' data1 #修改第3行cat->dog,并保存源文件为.bak[root@localhost test20210808]# cat data11 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy cat.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# cat data1.bak1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
6、-r:使用扩展的正则表达式
7、!:取反(跟在模式条件后与shell有所区别)(暂无例子)
三、sed-内部命令( a ; i ; p ; d ; s ; c ; y )
[root@localhost test20210807]# cat data1 #初始化数据1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
1、a :在匹配后面添加
[root@localhost test20210807]# sed \'ahello world\' data1 #在每行后追加helloworld1 the quick brown fox jumps over the lazy dog.hello world2 the quick brown fox jumps over the lazy dog.hello world3 the quick brown fox jumps over the lazy dog.hello world4 the quick brown fox jumps over the lazy dog.hello world5 the quick brown fox jumps over the lazy dog.hello world
2、i :在匹配前面添加
[root@localhost test20210808]# sed \'ihello world\' data1 #在每行前面插入helloworldhello world1 the quick brown fox jumps over the lazy dog.hello world2 the quick brown fox jumps over the lazy dog.hello world3 the quick brown fox jumps over the lazy dog.hello world4 the quick brown fox jumps over the lazy dog.hello world5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'/3 the/i\\hello world\' data1 #匹配模式在第3行前插入1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.hello world3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
3、p :打印
[root@localhost test20210808]# sed \'p\' data1 #打印文件内容,再输出一遍1 the quick brown fox jumps over the lazy dog.1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'3p\' data1 #打印第3行,再输出原始文件一遍1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
4、d :删除
[root@localhost test20210808]# sed \'d\' data1 #全部删除[root@localhost test20210808]# sed \'2d\' data1 #删除第二行1 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'2-5d\' data1 #删除第2-5行sed: -e expression #1, char 2: unknown command: `-\'[root@localhost test20210808]# sed \'d\' data1 #全部删除[root@localhost test20210808]# sed \'2d\' data1 #删除第2行1 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'2,5d\' data1 #删除第2-5行1 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'/3 the/d\' data1 #匹配模式删除第3行1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
5、s :查找替换
[root@localhost test20210808]# sed \'s/dog/cat/\' data1 #替换dog为cat1 the quick brown fox jumps over the lazy cat.2 the quick brown fox jumps over the lazy cat.3 the quick brown fox jumps over the lazy cat.4 the quick brown fox jumps over the lazy cat.5 the quick brown fox jumps over the lazy cat.[root@localhost test20210808]# sed \'3s/dog/cat/\' data1 #替换第3行dog为cat1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy cat.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'2,4s/dog/cat/\' data1 #替换第2-4行dog为cat1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy cat.3 the quick brown fox jumps over the lazy cat.4 the quick brown fox jumps over the lazy cat.5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'/3 the/s/dog/cat/\' data1 #匹配模式替换第3行dog为cat1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy cat.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
6、c :更改
[root@localhost test20210808]# sed \'c\\hello world\' data1 #每行更改hello worldhello worldhello worldhello worldhello world[root@localhost test20210808]# sed \'3c\\hello world\' data1 #修改第3行1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.hello world4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'2,4c\\hello world\' data1 #删除2-4行,并在第2行位置插入1 the quick brown fox jumps over the lazy dog.hello world5 the quick brown fox jumps over the lazy dog.[root@localhost test20210808]# sed \'/3 the/c\\hello world\' data1 #匹配模式更改第3行1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.hello world4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
7、y :转换
[root@localhost test20210808]# sed \'y/abcdefg/ABCDEFG/\' data1 #转换指定值1 thE quiCk Brown Fox jumps ovEr thE lAzy DoG.2 thE quiCk Brown Fox jumps ovEr thE lAzy DoG.3 thE quiCk Brown Fox jumps ovEr thE lAzy DoG.4 thE quiCk Brown Fox jumps ovEr thE lAzy DoG.5 thE quiCk Brown Fox jumps ovEr thE lAzy DoG.[root@localhost test20210808]# sed \'y/abcdefg/1234567/\' data1 #转换指定值1 th5 qui3k 2rown 6ox jumps ov5r th5 l1zy 4o7.2 th5 qui3k 2rown 6ox jumps ov5r th5 l1zy 4o7.3 th5 qui3k 2rown 6ox jumps ov5r th5 l1zy 4o7.4 th5 qui3k 2rown 6ox jumps ov5r th5 l1zy 4o7.5 th5 qui3k 2rown 6ox jumps ov5r th5 l1zy 4o7.
四、sed-flags:( 0-9 ; g ; p ; w filename )
[root@localhost test20210808]# cat data3 #数据准备-flags测试1 the quick brown fox jumps over the lazy dog.dog.2 the quick brown fox jumps over the lazy dog.dog.3 the quick brown fox jumps over the lazy dog.dog.4 the quick brown fox jumps over the lazy dog.dog.5 the quick brown fox jumps over the lazy dog.dog.
1、数字 :表示新文本替换的模式
[root@localhost test20210808]# sed \'s/dog/cat/2\' data3 #将第2个dog替换为cat1 the quick brown fox jumps over the lazy dog.cat.2 the quick brown fox jumps over the lazy dog.cat.3 the quick brown fox jumps over the lazy dog.cat.4 the quick brown fox jumps over the lazy dog.cat.5 the quick brown fox jumps over the lazy dog.cat.
2、g :表示用新文本替换现在文本的全部实例
[root@localhost test20210808]# sed \'s/dog/cat/g\' data3 #将所有的dog替换为cat1 the quick brown fox jumps over the lazy cat.cat.2 the quick brown fox jumps over the lazy cat.cat.3 the quick brown fox jumps over the lazy cat.cat.4 the quick brown fox jumps over the lazy cat.cat.5 the quick brown fox jumps over the lazy cat.cat.
3、p :表示打印原始的内容
[root@localhost test20210808]# sed \'3s/dog/cat/p\' data3 #将第3行第一个dog替换为cat,且打印出1 the quick brown fox jumps over the lazy dog.dog.2 the quick brown fox jumps over the lazy dog.dog.3 the quick brown fox jumps over the lazy cat.dog.3 the quick brown fox jumps over the lazy cat.dog.4 the quick brown fox jumps over the lazy dog.dog.5 the quick brown fox jumps over the lazy dog.dog.
4、w filename :将替换的结果写入文件
[root@localhost test20210808]# sed \'3s/dog/cat/w savedata3\' data3 #将第3行第一个dog替换为cat,且w保存到对应文件内1 the quick brown fox jumps over the lazy dog.dog.2 the quick brown fox jumps over the lazy dog.dog.3 the quick brown fox jumps over the lazy cat.dog.4 the quick brown fox jumps over the lazy dog.dog.5 the quick brown fox jumps over the lazy dog.dog.[root@localhost test20210808]# cat savedata33 the quick brown fox jumps over the lazy cat.dog.
五、sed-小技巧
[root@localhost test20210808]# cat data1 #测试数据1 the quick brown fox jumps over the lazy dog.2 the quick brown fox jumps over the lazy dog.3 the quick brown fox jumps over the lazy dog.4 the quick brown fox jumps over the lazy dog.5 the quick brown fox jumps over the lazy dog.
1、$统计文本有多少行
[root@localhost test20210808]# sed -n \'$=\' data1 #统计文本有多少行,等价于wc -l < data15
2、-r正则统计
[root@localhost test20210808]# sed -nr \'/^(root)(.*)(bash)$/p\' /etc/passwd #统计以root开头中间是任意,bash结尾的账户信息root:x:0:0:root:/root:/bin/bash
3、^每行开头插入内容
[root@localhost test20210808]# sed s/^/hi../ data1 #每行开头插入hi..hi..1 the quick brown fox jumps over the lazy dog.hi..2 the quick brown fox jumps over the lazy dog.hi..3 the quick brown fox jumps over the lazy dog.hi..4 the quick brown fox jumps over the lazy dog.hi..5 the quick brown fox jumps over the lazy dog.
4、$每行结尾追加内容
[root@localhost test20210808]# sed s#\\$#verygood# data1 #每行结尾追加verygood1 the quick brown fox jumps over the lazy dog.verygood2 the quick brown fox jumps over the lazy dog.verygood3 the quick brown fox jumps over the lazy dog.verygood4 the quick brown fox jumps over the lazy dog.verygood5 the quick brown fox jumps over the lazy dog.verygood
5、删除空行:/^$/d
[root@localhost test20210808]# cat data4 #测试数据test line1test line3 ok hello test very goodtest line5[root@localhost test20210808]# sed /^$/d data4 #删除空行test line1test line3 ok hello test very goodtest line5
6、删除空格:s/ *//g
[root@localhost test20210808]# cat data4 #测试数据test line1test line3 ok hello test very goodtest line5[root@localhost test20210808]# sed \"s/ *//g\" data4 #删除空格testline1testline3okhellotestverygoodtestline5
7、查看/删除-注释行或空行
[root@localhost test20210808]# cat data2 #测试空行和#号的删除# line1 注释# line2 注释line4 正文[root@localhost test20210808]# sed -ne \'/^#/p;/^$/p\' data2 #-e查看#号或空格开头# line1 注释# line2 注释[root@localhost test20210808]# sed -nr \'/(^#|#|^$)/p\' data2 #正则查看#号或空格开头# line1 注释# line2 注释[root@localhost test20210808]# sed -r \'/(^#|#|^$)/d\' data2 #正则删除#号或空格开头line4 正文