sed 是1种在线编辑器,它1次处理1行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下1行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑1个或多个文件;简化对文件的反复操作;编写转换程序等。
sed是1个很好的文件处理工具,本身是1个管道命令,主要是以行动单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解1下sed的用法
sed命令行格式为:
sed [-nefri] ‘command’ 输入文本
经常使用选项:
-n∶使用安静(silent)模式。在1般 sed 的用法中,所有来自 STDIN的资料1般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那1行(或动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在1个档案内, -f filename 则可以履行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
经常使用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的1行出现(目前的下1行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,由于是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的1行出现(目前的上1行);
p ∶列印,亦行将某个选择的资料印出。通常 p 会与参数 sed -n 1起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
举例:(假定我们有1文件名为ab)
删除某行
[root@localhost ruby] # sed '1d' ab #删除第1行
[root@localhost ruby] # sed '$d' ab #删除最后1行
[root@localhost ruby] # sed '1,2d' ab #删除第1行到第2行
[root@localhost ruby] # sed '2,$d' ab #删除第2行到最后1行
显示某行
. [root@localhost ruby] # sed -n '1p' ab #显示第1行
[root@localhost ruby] # sed -n '$p' ab #显示最后1行
[root@localhost ruby] # sed -n '1,2p' ab #显示第1行到第2行
[root@localhost ruby] # sed -n '2,$p' ab #显示第2行到最后1行
使用模式进行查询
[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
[root@localhost ruby] # sed -n '/$/p' ab #查询包括关键字$所在所有行,使用反斜线屏蔽特殊含义
增加1行或多行字符串
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第1行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第1行到第3行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea
or coffee' ab #第1行后增加多行,使用换行符
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
代替1行或多行
[root@localhost ruby] # sed '1c Hi' ab #第1行代替为Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab #第1行到第2行代替为Hi
Hi
end
替换1行中的某部份
格式:sed 's/要替换的字符串/新的字符串/g'
(要替换的字符串可以用正则表达式)
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
插入
[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后1行直接输入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye
搜索 /etc/passwd有root关键字的行
如果root找到,除输出所有行,还会输出匹配行。
使用-n的时候将只打印包括模板的行。
删除/etc/passwd所有包括root的行,其他行输出
找到匹配模式eastern的行后,
搜索/etc/passwd,找到root对应的行,履行后面花括号中的1组命令,每一个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
如果只替换/etc/passwd的第1个bash关键字为blueshell,就退出
最后的q是退出。
除整行的处理模式以外, sed 还可以用行动单位进行部份数据的搜索并取代。基本上 sed 的搜索与替换的与 vi 相当的类似!他有点像这样:
先视察原始信息,利用 /sbin/ifconfig 查询 IP
本机的ip是192.168.1.100。
将 IP 前面的部份予以删除
接下来则是删除后续的部份,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
将 IP 后面的部份予以删除
1条sed命令,删除/etc/passwd第3行到末尾的数据,并把bash替换为blueshell
-e表示多点编辑,第1个编辑命令删除/etc/passwd第3行到末尾的数据,第2条命令搜索bash替换为blueshell。
sed 可以直接修改文件的内容,没必要使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随意拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!
利用 sed 将 regular_express.txt 内每行结尾若为 . 则换成 !
利用 sed 直接在 regular_express.txt 最后1行加入『# This is a test』
由於 $ 代表的是最后1行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来讲,如果你有1个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!由于文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你乃至不需要使用 vim 去修订!
参考 http://vbird.dic.ksu.edu.tw/linux_basic/0330regularex_2.php#sed
http://www.cnblogs.com/stephen-liu74/archive/2011/11/17/2245130.html
上一篇 使用grep快速定位代码位置
下一篇 Paint类常用方法