sed可依照script的指令,来处理、编辑文本文件。
sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
语法 sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
动作说明:
实例
1、在testfile.txt第一行后面添加一行newLine,并将结果输出到屏幕上:
sed -e 1a\newLine testfile |
---|
需要注意的是,这种-e的方法并没有在文件内部真正添加这一行数据,只是在终端的显示上面添加了。
如果需要增加多行,则需要在增加的内容上利用\n换行
2.以行为单位的新增,删除
将 testfile.txt中的内容列出并且列印行号,同时,请将第 2~4 行删除!
nl testfile.txt | sed '2,4d'或者sed '2,4d' testfile.txt |
---|
要删除第 3 到最后一行
nl testfile.txt | sed '3,$d'或者sed '3,$d' testfile.txt |
---|
这里的$符号,就是最后一行的意思
如果要在第二行前面添加一行,内容为'new line 2',命令如下:
nl testfile.txt | sed '2i new line 2'或者sed '2i new line 2' testfile.txt |
---|
3.以行为单位的替换和显示
如果我们想把第2-4行的数据替换为 line 2~4,可以使用下面的命令:
nl testfile.txt | sed '2,4c line 2~4'或者sed '2,4c line 2~4' testfile.txt |
---|
将文件从第3行到最后一行打印出来:
nl testfile.txt | sed -n '3,$p'或者sed '3,$p' testfile.txt |
---|
4.数据搜寻处理
搜索 testfile.txt中包含有关键字‘4’的行
nl testfile.txt | sed -n '/4/p'或者sed -n '/4/p' testfile.txt |
---|
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!有点像这样:
sed 's/要被取代的字串/新的字串/g' |
---|
举个例子,我们查看自己电脑的ip地址,如下:
如果我们相用一条命令把这个inet addr查出来,应该怎么做呢?
首先通过命令找到inet addr这一行,
将inet addr前面的部分删除:
ifconfig eth3|grep 'inet addr'|sed 's/^.*addr://g' |
---|
注意,其中的^.*addr:代表的是从开始到addr:前面的字符。后面的双斜线里面什么都没写,说明是替换为空串,也就是删除的意思。
再讲inet addr后面的部分删除:
ifconfig eth3|grep 'inet addr'|sed 's/^.*addr://g'|sed 's/Bcast.*$//g' |
---|
Bcast.*$指的是从Bcast到最后面的字符。后面的双斜线里面什么都没写,说明是替换为空串,也就是删除的意思。
这样,我们就直接得到了一个IP地址。
5.危险动作:直接修改文件内容
上面所述的四种方法,都是不直接修改文件内容的,他们仅仅修改文件在控制台输出的结果,当我们想要直接修改文件内容的时候,需要添加-i参数,这里我们进行一些实验,首先我们编辑一个测试文件testfile2.txt,内容如下:
我们可以看到,每一行都是一个单词加一个符号,前四行是以.结尾,后面两行是以-结尾,我们首先进行如下操作,将以.结尾的行,换成!结尾,命令如下:
sed -i 's/\.$/\!/g' testfile2.txt |
---|
我们对这个命令进行解释:替换命令内部结构依旧是s/旧字符串/新字符串/g的模式,这里的旧字符是' \.$ ',而新字符串是' \! ' ,这里使用反斜线\屏蔽特殊含义
6.其他的一些应用
删除匹配行
sed -i '/匹配字符串/d' filename
(注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
替换匹配行中的某个字符串
sed -i '/匹配字符串/s/旧字符串/新字符串/g' filename