sed:stream editor,流式编辑器的意思。
sed命令的格式:
1.sed [选项] '命令' 输入文件,比如sed -n '1p' a.txt
2.输入源 | sed [选项] '命令' ,比如cat a.txt| sed '1a haha'
常用的选项:
-n∶不加-n,处理文件的内容都会打印在屏幕上,加上 -n 参数后,则只有经过sed 特殊处理的那一行才会被列出来。
-e∶可以让sed支持多重编辑
-i∶直接对当前处理的文件进行修改,而不是打印在屏幕上
常用的命令:
a:append附加的意思,如'1a haha'表示在要处理文件的第一行后边加上haha
i:insert的缩写,插入的意思,跟append的区别在于会插入在指定行的前面
d:delete的缩写,删除的意思,如'3d' 表示删除第三行
c:replace的缩写,替换的意思,不支持正则表达式,如'1,$c haha'表示把正在处理的文件的第一行到最后一行用haha替换
s:支持正则表达式,格式是'1s/要被替换的字符串/新的内容/[g]','1,2s/html/HTML/'表示把第1行和第2行里面的html用HTML来替换
p:print,'5p' 打印第5行
理论看了还是迷糊,看几个例子就豁然开朗了。
我现在有如下文档:
[root@node78 ~]#cat h5.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
</body>
</html>
一、a命令,在1行后面插入一行,内容是“haha”,输入sed '1a haha' h5.html:
二、i命令,在1行前面插入一行,内容是“haha”,输入sed '1i haha' h5.html:
三、d命令,删除第3行吧,输入sed '3d' h5.html:
四、把第一行到第3行替换为haha,输入sed '1,3c haha' h5.html:
五、把第一行到最后一行里面的字母和数字都替换为#,这个没办法在用c命令了,因为c命令不支持正则表达式,我们用支持正则的s命令,输入命令sed '1,$s/\w/#/g' h5.html,这里解释一下,在sed的命令里面的$表示最后一行,g表示全部替换:
六、打印第4行的内容,如果我们使用sed '4p' h5.html,因为sed默认就是打印源文档经过命令处理后的结果,所以这里会打印全部,我们如果只想看第四行,那就要加上-n选项,表示只打印经过了命令处理的行,这里所谓经过命令处理就是指"4p"处理了,因此常常把-n和p连用,表示我们只看我们打印的行:
[root@node78 ~]#sed -n '4p' h5.html
<meta charset="utf-8">
七、在第一行前边和后边分别插入haha,你怎么办?你可以先执行sed '1i haha' h5.html,再执行sed '1a haha' h5.html,但是这样还是不能满足同时插入的效果,它们分开执行后只能看到各自的效果,因为sed如果不加-i真正修改文件的话,sed命令并不改变文件内容,那怎么做到同时插入呢?这时候要用到-e选项,表示可以多重编辑,就是多次编辑的意思:
八、上边说了那么久,做了那么多,h5.html的内容纹丝未动,一点也没有改变,如果想要上边的操作真实的对h5.html文件生效的话,就需要使用-i选项:
[root@node78 ~]#cat h5.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
</body>
</html>
[root@node78 ~]#sed -i -e '3i haha' -e '3d' h5.html
[root@node78 ~]#cat h5.html
<!doctype html>
<html>
haha
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
</body>
</html>
[root@node78 ~]#
观察h5.html前后的内容可以看到,加了-i选项确实真实的改变了它的内容。