sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed使用参数
[root@www ~]# sed [-nefr][动作]
选项与参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
特殊符号&代表被替换的内容
[oot@www ~]# sed '1s/zsq/&1/g' test #将第一行的zsq替换为zsq1
[root@www ~]# sed -i -e '2 s/^/#/' test #将第二行注释
[root@data-1-1 ~]# sed 's/^ *//g' test #删除test文本中行首空格
[root@data-1-1 ~]# sed -i '$ a file' test #最后一行插入file
[root@data-1-1 ~]# sed 's/zsq/&e/g' test #匹配的字符串后添加e
then is zsqe and sisi
[root@data-1-1 ~]# sed 's/zsq/e&/g' test #匹配的字符串前添加e
then is ezsq and sisi
[root@data-1-1 ~]# sed -i '/zsq/i tcs' test #在匹配的行前插入
[root@data-1-1 ~]# cat test
tcs
then is zsq and sisi
[root@data-1-1 ~]#sed -i '/zsq/a tcs1' test #在匹配的行后插入
[root@data-1-1 ~]# cat test
tcs
then is zsq and sisi
tcs1 [root@data-1-1 ~]# sed 's/^/wap &/g' test #在行首添加wap字符
wap tcs
wap then is zsq and sisi
wap tcs1
wap [root@data-1-1 ~]# sed 's/$/& www/g' test #在行尾添加www字符
tcs www
then is zsq and sisi www
tcs1 www
[root@data-1-1 ~]# sed G test #每一行后面增加一空行 [root@data-1-1 ~]# sed -i '/^$/d' test #将空行删除
[root@data-1-1 ~]# sed 'G;G' test #增加两空行 [root@data-1-1 ~]# sed 's/^.//g' test #删除文件开头的第一个字符 [root@data-1-1 ~]# sed -i 's/$/m/g' test #在文件最后添加特定字符m 删除行首空格 sed ‘s/^[ \t]*//g' 说明: 第一个/的左边是s表示替换,即将空格替换为空。第一个/的右边是表示后面的以xx开头。中括号表示“或”,空格或tab中的任意一种。这是正则表达式的规范。 中括号右边是*,表示一个或多个。第二个和第三个/中间没有东西,表示空g表示替换原来buffer(缓冲区)中的,sed在处理字符串的时候并不对源文件进行 直接处理,先创建一个buffer,但是加g表示对原buffer进行替换,整体的意思是:用空字符去替换一个或多个用空格或tab开头的本体字符串 删除行末空格 sed ‘s/[ \t]*$//g' 和上面稍微有些不同是前面删除了^符,在后面加上了美元符,这表示以xx结尾的字符串为对象。 但是要注意在KSH中,Tab并不是\t而是直接打入一个Tab就可以了。 删除所有的空格 sed s/[[:space:]]//g sed找到关键字所在行并将其前面的第一个字符删除的命令 sed -i '/httpd-vhosts/s/^#//' httpd.conf #Include conf/extra/httpd-vhosts.conf sed匹配第二个进行替换 sed -i ":a;N;\$!ba;s/$BACKUPIP/$MASTERIP/2" httpd.conf #\$反斜杠是在shell脚本里不要当作一个变量去执行 sed匹配第一个进行替换 sed -i “0,/$BACKUPIP/s/$BACKUP/$MASTERIP” httpd.conf
直接修改文件内容(危险动作)
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用下载的 regular_express.txt 文件来测试看看吧!
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
[root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt
利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』
[root@www ~]# sed -i '$a # This is a test' regular_express.txt
由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test』!
sed 的『 -i 』选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!