举荐:每天一个 Linux 命令(2):od
性能简介
sed是一种流编辑器,也是文本处理中十分好的工具,配合正则应用更弱小解决时,把以后解决的行存储在长期缓冲区中,称为“模式空间”,接着用sed命令解决缓冲区的内容,实现后输入到屏幕,接着解决下一行。文件内容并没有扭转,除非应用-i选项。sed次要用来编辑一个或多个文件,简化对文件的重复操作或者用来编写转换程序等。
sed性能同awk相似,差异在于,sed简略,对列解决的性能要差一些,awk性能简单,对列解决的性能比拟弱小。
命令格局
sed [options] 'command' file(s) sed [options] -f scriptfile file(s)
罕用参数
-e #以指定的指令来解决输出的文本文件-n #勾销默认输入(如果和p命令同时应用只会打印产生扭转的行)-h #帮忙-V #显示版本信息
罕用动作
a #在以后行上面插入文本i #在以后行下面插入文本c #把选定的行改为新的文本d #删除,删除抉择的行D #删除模板块的第一行 s #替换指定字符h #拷贝模板块的内容到内存中的缓冲区H #追加模板块的内容到内存中的缓冲区g #取得内存缓冲区的内容,并代替以后模板块中的文本 G #取得内存缓冲区的内容,并追加到以后模板块文本的前面 l #列表不能打印字符的清单n #读取下一个输出行,用下一个命令解决新的行而不是用第一个命令N #追加下一个输出行到模板块前面并在二者间嵌入一个新行,扭转以后行号码p #打印匹配的行P #(大写)打印模板的第一行q #退出Sedb #lable 分支到脚本中带有标记的中央,如果分支不存在则分支到脚本的开端r #file 从file中读行t #label if分支,从最初一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的开端T #label 谬误分支,从最初一行开始,一旦产生谬误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的开端w #file 写并追加模板块到file开端**W #file 写并追加模板块的第一行到file开端**! #示意前面的命令对所有没有被选定的行产生作用** = #打印以后行号码**# #把正文扩大到下一个换行符以前**
Sed替换命令
g #示意行内全面替换(全局替换配合s命令应用)p #示意打印行 w #示意把行写入一个文件 x #示意调换模板块中的文本和缓冲区中的文本 y #示意把一个字符翻译为另外的字符(然而不用于正则表达式) 1 #子串匹配标记 & #已匹配字符串标记
Sed正则
^ #匹配行开始 $ #匹配行完结. #匹配一个非换行符的任意字符* #匹配0个或多个字符[] #匹配一个指定范畴内的字符[^] #匹配一个不在指定范畴内的字符 (..) #匹配子串& #保留搜寻字符用来替换其余字符< #匹配单词的开始> #匹配单词的完结x{m} #反复字符x,m次x{m,} #反复字符x,至多m次 x{m,n} #反复字符x,至多m次,不多于n次
Sed罕用实例
1、替换操作
echo "hello world" |sed 's/ /-/1g'hello-world #从第一个空格开始全局替换成-,只不过文本中只有一个空格
2、删除操作
sed '/^$/d' filename #删除空白行sed '2d' filename #删除第二行sed '2,$d' filename #删除第二直到未尾所有行sed '$d' filename #删除最初一行sed '/^test/'d filename #删除以test结尾行
3、匹配替换
echo "hello world" |sed 's/w+/[&]/g'[hello] [world]echo "hello world" |sed 's/w+/"&"/g'"hello" "world"#w+匹配每一个单词,&示意匹配到的字符串echo AAA bbb |sed 's/([A-Z]+) ([a-z]+)/[2] [1]/'[bbb] [AAA]#子串匹配替换
4、选定范畴
sed -n '/= 0/,/max/p' svnserve.conf#min-encryption = 0#max-encryption = 256#所有在=0到max范畴内的行都会被打印进去
5、sed多点编辑性能(-e)
[root@centos001 ~]#cat -n test 1 this is a test file2 welcome3 to4 here5 hello WORLD67 linux centos6.88 redhatsed -e '2,6d' -e 's/linux centos6.8/Linux Centos6.8/' testthis is a test fileLinux Centos6.8redhat#如果两条命令性能一样,那么就须要用到上面的参数sed --expression='s/linux centos6.8/Linux Centos6.8/' --expression='s/to/TO/' test**this is a test filewelcomeTOherehello WORLDLinux CenTOs6.8redhat
6、读入与写入
[root@centos001 ~]#cat test1welcom to here[root@centos001 ~]#sed '/here/r test1' testthis is a test filewelcometohere#welcomtohere#hello WORLDlinux centos6.8redhat#将test1的文件内容读取显示所有匹配here行的前面sed -n '/centos6.8/w test2' test[root@centos001 ~]#cat test2linux centos6.8#将test文件匹配到centos6.8的所有行都写入到test2文件中,文件能够不存在.#如果文件存在,就会被重定向不是追加
7、追加与插入
[root@centos001 ~]#sed '/^l/a2017-08-08' test2linux centos6.82017-08-08#在匹配以l结尾的行的前面追加2017-08-08[root@centos001 ~]#sed '1a2017-08-08' test2linux centos6.82017-08-08#在第一行的前面追加2017-08-08[root@centos001 ~]#sed '/^l/i2017-08-08' test22017-08-08linux centos6.8#在匹配以l结尾的行的后面插入2017-08-08#######以上操作是不会扭转文件内容################[root@centos001 ~]#sed -i '/^l/i2017-08-08' test2[root@centos001 ~]#cat test22017-08-08linux centos6.8
8、其它命令实例
[root@centos001 ~]#cat -n test2 1 2017-08-08 2 linux centos6.8 3 08 4 5 test[root@centos001 ~]#**sed '/08/{ n; s/l/L/; }' test22017-08-08Linux centos6.808test#如果08匹配到就跳到下一行,将小写l替换成大写,留神到第三行也是被匹配到#然而前面的条件不满足,所有没有被替换[root@centos001 ~]#sed '1,4y/8/9/' test22017-09-09linux centos6.909test#将1至4行所有的数字8替换成9[root@centos001 ~]#**sed '1q' test2**2017-08-08#打印第一行内容后退出
9、打印奇数或公偶数行
[root@centos001 ~]#sed -n 'p;n' test22017080808[root@centos001 ~]#sed -n 'n;p' test2linux centos6.8test[root@centos001 ~]#sed -n '1~2p' test22017080808[root@centos001 ~]#sed -n '2~2p' test2linux centos6.8test
10、打印匹配字符串行的下一行
[root@centos001 ~]#sed -n '/linux/{n;p}' test208[root@centos001 ~]#awk '/linux/{getline; print}' test208
每天一个Linux命令(1):xargs