1. 如果要将sed编辑的结果写入文件,需要-i参数,如果存在多个编辑指令,需要在前面添加-e参数
sed -i -e 's/hhhhh/hello/g' -i -e 's/ha/ho/g' test ,不能写成-ie (注意:i 必须在e之前,否则会报错)
2. 删除最后一行 sed '$d' file(注意这里的$和vi编辑命令中使用字符串替换命令时的$意思类似,表示文件的最后一行,不是代表单纯输入$时表示跳到一行的末尾)
3. 删除所有行的命令sed '1,$d' file,如果配合-i则相当于是清空文件(和vi编辑中 :1,$s/word1/word2/g类似,但后者需要文档中都是同样的单词)
4. sed中删除第n行是sed 'nd' file(类似vi编辑命令中删除一行是使用dd),反之需要仅仅保留某行时,输入sed 'n!d' file
这里的感叹号的使用也可以扩展,需要活学活用,比如使用在sed -n 'n!p'即表是将除了第N行之外的所有行打印出来。
另举例如下:某文件夹下包含了如下的文件,中间的省略号表示包含2015时间的文件有很多
-rw-------. 1 billcs billcs 438512 10月 27 17:50 ABM_CMdbInUser.mdb.0058.20150926
-rw-------. 1 billcs billcs 438512 10月 27 17:40 ABM_CMdbInUser.mdb.0072.20151010
-rw-------. 1 billcs billcs 438512 10月 27 17:50 ABM_CMdbInUser.mdb.0080.20151018
-rw-------. 1 billcs billcs 29696 10月 27 17:53 ABM_CMdbInTidB.mdb
为了将所有不包含2015时间的文件显示出来,可以使用如下的命令:
ls -l | sed -n '/2015/!p'
5. sed 's/linux/bowen/2' file 表示对每一行第二个linux字符串进行替换,不满足条件即使处在整行第二的位置也不替换
注意:s/linux/bowen/的写法其实默认是省略了1,即和s/linux/bowen/1的含义是一致的,只将每一行的第一个linux进行替换,如果写成2的话则就是上面的意思了。
6. 删除包含某字符串的行sed '/str1/d' file(这也和vi编辑中s/str1/str2/g类似,前面的s和后面的g都是替换字符串需要的,而这里是/d,且/str1就是要将str1找出来并换成str2,而sed中执行删除时不是替换,仅需要找出str1出来而已)
被替换的str1不需要是完整显示且前后都是空白的字符串,可以只是完整字符串其中的一部分,例如:
file内容为
line1 1 2 3 4
line2 hello nihao haha bye
line3 xilineha linux bowen xixi
line4 bowen unix linux haha
执行sed 's/line/hoho/2' file,结果为:
line1 1 2 3 4
line2 hello nihao haha bye
line3 xihohoha linux bowen xixi
line4 bowen unix linux haha
即只将第三行第二个字符串中的一部分line替换成了hoho
7. 删除空行 sed '/^$/d' file(不包括空格,TAB和控制字符行)
8. sed字符转换的用法 sed 'y/1234/ABCD/' file
1)可以这么记忆y,相当于是每替换一个字母时都需要询问确认一下 y or n?(切记是将全文每个对应的字符都替换,而不是只替换1234字符串)
2)和tr相比较,本命令的缺点就是转换字符和被转换字符长度一定要相等
9. sed '/linux/a gbh' file和sed '/linux/a\gbh' file效果一样(a表示在匹配行的下一行添加内容,i表示在上一行添加内容)
10. 读取外部文件test时,如果test和file在同一个路径下,可以直接添加单引号,不需要输入./test,如下:
sed '/line1/r 'test'' file
建议直接使用绝对路径而不添加单引号
11. 使用p打印命令时需要添加-n参数,否则因为sed本身会默认将所有的行都打印出来,又由于添加了p命令,所以会使得结果中出现重复的行。
例如:输入 sed '1p' file,由于未带-n,第一行出现了重复
line1 1 2 3 4
line1 1 2 3 4
line2 hello nihao haha bye
line3 hellod linux linux xixi
line4 line5 unix linux haha
12. sed -f sedrule file 将常用的指令写入sedrule文件中,通过-f参数就可以进行调用,这实际上是将使用sed时单引号中的指令集中放到文件中,便于使用,所以文件中的指令不需要再加单引号。例如:cat sedrule后显示:
/^$/d
s/linux/bowen/g
13. 替换匹配行的下一行 sed '/line2/{n;s/hello/bowen/}' file (n可以理解为next的意思)
如果不添加n,直接是sed '/line2/{s/hello/bowen/}' file,该命令的含义就是先定位到某一行,然后对本行进行替换操作
14. l(L的小写)表示列出非打印字符,如常用的查看文件中TAB的命令 sed -n l file
15. sed -n '$=' test.sh 获取文件的总行数,和awk 'END{print NR}' test.sh效果一样
(这和ll | wc -l获取的结果是有差异的,wc会比前两者少1,因为wc是计算当前文件夹下的文件数再加上文件夹本身。前面两个是获取直观的文件数和隐藏的.和..的总和)
16,动态获取文件的每一行的内容 sed -n "${n}p" test.sh ,其中n是变量,所以必须使用双引号
(注意这里必须使用双引号,如果n为1,在使用sh -x调试时可以发现会打印成sed -n '1p' test.sh,即双引号此时解释成了单引号)
--END--
鉴于数据分析能力越来越成为每个职场人的必备技能,所以我最近新打造了本垂直公号,这里聚焦分享数据分析和脚本编程的干货,欢迎大家都转起来,让更多的人来一起碰撞,交流,提升!