shell脚本(五)
(1)sed
a、常用参数
#文件编辑工具,可对文本文件和标准输入进行编辑,标准输入可以是键盘输入、
#文件重定向、字符串、变量、以及管道文本。
#-n:不打印所有行到标准输出;-e:将下一个字符串解析为sed编辑命令
#-f:调用sed脚本文件
b、定位文本
#x:指定行号;x,y:指定从x行到y行范围;
#/pattern/:查询包含模式的行;
#/pattern/pattern/:查询包含两个模式的行;
#/pattern/,x:从与pattern匹配行到x行之间的行
#x,/pattern/:从x行到与/pattern/匹配行之间的行
#x,y!:查询不包括x和y行号的行;
#p:打印匹配行;=:打印文件行号;a\:在定位行之后追加文本;
#i\:在定位行之前追加文本;
#d:删除定位行;c\:用新文本替换定位的文本;s:使用替换模式替换相应模式
#r:从另一个文件读取文本;w:将文件写入到文件;y:变换字符;
#q:第一个模式匹配之后就退出;
#1:显示与八进制ascii码等价控制字符;{}:在定位行执行的命令组;
#n:读取下一个输入行,用下一个命令处理新的行
#打印第1行,并且打印/不打印文件所有行
sed '1p' a.txt
sed -n '1p' a.txt
#打印第2行到第4行
sed -n '2,4p' bkname.txt
#打印不在第2到第4行的行
sed -n '2,4!p' bkname.txt
#定位行前1行追加文本
sed '/NAME5/i\Add_string" bkname.txt
#定位行后1行追加文本
sed '/NAME5/a\add_string' bkname.txt
#使用正则表达式需要使用s选项
#同1行定位字符串前面追加文本
sed 's/name5/addstring&/' bkname.txt
#同1行定位字符串后面追加文本
sed 's/name5/&addstring/' bkname.txt
#修改定位文本
#将NAME5替换成rp_string
#将NAME5定位行整行替换成rp_string
sed '/NAME5/c\rp_string' bkname.txt
#删除文本,分别删除第6行,第2行到第5行
sed '6d' bkname.txt
sed '2,5d' bkname.txt
#删除不在第2到第9行的行,实际就是显示第2到第9行
sed '2,9!d' bkname.txt
#参数p和g区别,p:球只替换第1次出现匹配的文本;
#g:表示替换所有出现的匹配的文本
#sed是按行来处理的,所以要删除1行中多次出现匹配文本的话,需要使用g,注意两者区别
sed -n 's/name/*/p' bkname.txt
sed -n 's/name/*/g' bkname.txt
#字符变换,一一对应替换
#a替换成E,b替换成F,c替换成G,d替换成H
sed 'y/abcd/EFGH/' bkname.txt
#元字符匹配,定位到最后1行
sed -n '$p' bkname.txt
sed -n '$'p bkname.txt
#定位以test结尾的行
sed -n '/test$/p' bkname.txt
#定位行到指定行,如果指定行数值>定位行数值,则会打印
#指定行到最后1行,如指定行8>4(name4所在行数值)
sed -n '3,/name4/p' bkname.txt
sed -n '8,/name4/p' bkname.txt
#等价于
sed -n '8,$p' bkname.txt
#定位行到指定行,如果指定行数值>定位行数值,则只会打印定位行
sed -n '/name4/,6p' bkname.txt
sed -n '/name4/,2p' bkname.txt
#"!"叹号:表示非,显示不在第2到第9行的行
#=:只打印行号
sed -n '/name4/=' bkname.txt
#l(小写L):显示控制符
sed -n '1,$l' bkname.txt
#-e:使用多个编辑命令
sed -n '/name4/{p;=}' bkname.txt
sed -n -e '/name4/p' -e '/name4/=' bkname.txt
#n:处理定位行的下一行,对定位行的下1行的"00"替换成"*"
sed '/name1/{n;s/00/*/g;}' bkname.txt
#打印定位行的下一行
sed -n '/name2/{n;p}' bkname.txt
#在定位行执行命令组,注意是对定位行操作
sed '/name1/{s/100/*/g;s/name/ttt/g;}' bkname.txt