【知识涌升】sed我来啦

sed其实是一个非常简单的小东西,只不过之前一直都没有仔细看过,这两天看了一下,不过如此嘛

来个介绍,sed本质上来说其实是一个stream editor,是以行为单位的,主要是操作文件再重定向到一个地方,或者是通过管道把屏幕上的东东进行简单的处理就ok了的东西,比起awk,perl之类的,只能算是小儿科,但是非常简单易用的特性也使得深受广大linuxer们喜爱。

1、首先行号是1,$就算完了删除直接就是d。-e选项是告诉sed,后面''内的就是要执行的脚本了,不用-e而用-f的话,就可以把''内的东西都写到一个文件中去就可以了。

比如删除1-10行

sed -e '1,10d' test.txt

2、替换就是s///的格式,其中的/可以换成别的符号###,===都可以。多次修改的话,用;隔开就是了,同时/value/的格式就定位了行。

比如要在每个有two的行,将1替换成2,在每个有three的行,把1替换成3

sed -e '/two/ s/1/2;/three/ s/1/3' test.txt

3、请注意,2中例子里面的替换,在每行中,如果有好几个1,那么其替换的只会是第一个找到的1,如果想要每个都替换就要加上g这个anchor。同时由于sed不会修改文件,那么如果你要修改文件的话,只能重新输入到一个文件里面,再把文件mv回原来的文件处才可以,这里也可以制定行号那样子来进行替换,而还有一个比较重要的选项就是-n,就是不把stream显示出来,p则可以重新显示出来。

比如要进行3-5行,每行所有的1都要替换成2,只把3-5行显示出来的话

sed -n -e '3,5 s/1/2/gp' test.txt

4、对文本的添加可以用i或者是a,i就是insert,a就是append,就是一个是在之前,一个是在之后罢了。还看到了一个就是直接在行尾加的话可以用&这个符号来处理。再有就是写文件的w

比如在第3行后面加上1行,内容是about

sed -e '3a about' test.txt

比如在每行的行尾加上see you这串字符串

sed -e 's/^.*$/&see you/' test.txt

行首的话,同时想写入change.txt文件的话

sed -e 's/^.*$/see you&/w change.txt' test.txt

5、c是copy的意思,这里可以用作找到pattern之后来覆盖原来的行,注意是原来的行都不见了,直接把行给替换掉了

比如,想把文件中所有的小写two的行,都换成1行,每行只有TWO一个单词

sed -e '/two/c TWO' test.txt

6、!代表的是去做不满足条件的事情

比如删除不包含two的所有行

sed -e '/two/ !d' test.txt

7、默认sed是把文件的所有行都读入来进行处理的,也可以不要这么做,加入q来提前退出

比如进行5行的替换,之后退出

sed -e 's/name/NAME;5q' test.txt

接下来举几个比较有意思的例子

1、如何间隔的输出奇偶行

奇行

sed -n -e 'p;n' test.txt

偶行

sed -n -e 'n;p' test.txt

稍微解释一下n,这里的n与前面的参数-n是不一样的,man里面的解释为

n/N --> Read/append the next line of input into the pattern space

需要注意的是,如果在脚本里用了n或者是N,比如你要处理文件有5行,你在第2行的时候有n,那么你要处理的文件的第3行就会在处理第2行的时候提前被处理,第3行就不会再处理了,即是说,脚本的内容就不会对第3行再进行一遍,只会因为在第2行的时候读入,那么第3行就没了。

2、把每行第一个单词和最后一个单词交换位置

sed -e 's=^\([^a-zA-Z]*\)\([a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z][^a-zA-Z]*\)\([a-zA-Z][a-zA-Z]*\)\([^a-zA-Z]*\)$=\1\5\3\4\2\6=' test.txt

有点NB,是不是?

 

 

没啥别的了,基础还是正则替换,剩下就是基本的一些语法,掌握了之后你就可以说你掌握了sed了

posted @ 2012-09-19 16:46  poiu_elab  阅读(320)  评论(0编辑  收藏  举报