首页 服务器系统 Linux

Linux的入门系列——sed命令详解

sed一次只处理一行内容,把当前要处理的行存储在临时缓冲区中,称为“模式空间(pattern space)”,

sed 默认不编辑原文件,仅对模式空间中的数据做处理,是一行一行进行的,当处理完一行后,就将当前模式空间中的内容给打印到屏幕上。

用法

sed [Options] 'AddressCommand'  file …
sed [ options ] –f sedscript_filename filename

Options常用的选项有以下几个:

  • -n: 静默模式,不显示模式空间中的行,只显示匹配到的行;
  • -i[suffix]: 表示可能直接修改原文件,如果指定了suffix即后缀,则会对原文件进行备份;
  • -e SCRIPT –e SCRIPT 可以同时执行多个脚本;
  • -f /path/to/sed_script :可以把很多个sed的处理脚本写在一个文件中,然后使用-f来加载这个文件;
  • -r: 表示支持扩展的正则表达式;

Address可以有以下三种表示方法:

  1. StartLine,EndLine
    比如: 1,100
  2. /RegExp/ 正则表达式,注意正则表达式必须使用//包围起来;
    比如: /^root/
  3. /RegExp1/,/RegExp2/ 从第一次被RegExp1匹配到的行开始,到第一次被RegExp2匹配到的行结束,这中间的所有行;
  4. LineNumber 精确到特定的行;
  5. $ 表示文件的最后一行;
  6. StartLine,+N 表示指定从StartLine 行开始,向后的N行;

Command中常用的有以下几个:

  • a\string: 在指定行的后面追加新行,内容为“string”;
  • i\string: 表示在指定行的前面添加新行,内容为“string”;
  • d: 删除符合条件的行;
  • p: 显示(打印)符合条件的行;
  • r filename: 将指定的文件的内容追加到匹配行的后面;
  • w filename: 将“地址”指定范围内的行,另存到指定的文件中去;
  • s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次匹配到的字符串;

常见的修饰符有以下两种:

  • g: 表示全局替换,不管是不是第一次匹配的,全部替换;
  • i: 在匹配的时候不考虑大小写;

还有一个要注意的是s/pattern/string/ 中的/还可以换成 # 和@符号的。这样在查找‘/’的时候就不用再去转义了;

案例1:&表示前面匹配到的全部内容

[root@ns2 tmp]# cat test.txt
hello like
hi love
[root@ns2 tmp]#
[root@ns2 tmp]# sed 's/l..e/&r/' test.txt //说明&可以代表所有匹配到的字符串
hello liker
hi lover
[root@ns2 tmp]#

案例2:分组和引用

 // \(\) 可以用来分组,在后面进行引用的时候可以使用\1来引用第一个分组;
// \2用来引用第二个分组内的内容
[root@ns2 tmp]# sed 's/\(l..e\)/\1r/' test.txt
hello liker
hi lover
[root@ns2 tmp]#

案例3:删除匹配到的行

[root@apache ~]# cat test.txt
jack huaxue 90
tom huaxue 70
jane shuxue 99
tony shuxue 80
[root@apache ~]#
//删除了带有’jack’的行
[root@apache ~]# sed '/jack/d' test.txt
tom huaxue 70
jane shuxue 99
tony shuxue 80
[root@apache ~]#
//将test.txt文件的第2行到最后一行全部删除:
[root@apache ~]# sed '2,$d' test.txt
jack huaxue 90
[root@apache ~]#

案例4:匹配并替换操作

//将整行内的’jack’替换成’jack.rose’,并且打印出来
[root@apache ~]# sed -n 's/jack/jack.rose/gp' test.txt
jack.rose huaxue 90
[root@apache ~]# 
//‘g’表示把当前行中所有的匹配到的字符都替换掉。
//‘-n’和‘p’一起使用表示只打印那些发生替换的行。

//上面的这个例子还可以用下面的这种方法来写:
[root@apache ~]# sed -n 's/^jack/&.rose/gp' test.txt
jack.rose huaxue 90
[root@apache ~]#

//打印出从包含/tom/的行到包含/tony/的行之间的所有行:
[root@apache ~]# sed -n '/tom/,/tony/p' test.txt
tom huaxue 70
jane shuxue 99
tony shuxue 80
[root@apache ~]#

//打印出第2行到以’jane’开头的行:
[root@apache ~]# sed -n '2,/^jane/p' test.txt
tom huaxue 70
jane shuxue 99
[root@apache ~]#

案例5:执行多个命令

//将test.txt文件的第1行删除,再把后面的’tom’都替换成’tomcat’
[root@apache ~]# sed -e '1d' -e 's/tom/tomcat/gp' test.txt
tomcat huaxue 70
tomcat huaxue 70
jane shuxue 99
tony shuxue 80
[root@apache ~]#
//如果加了’-n’则只会显示tomcat那一行。
// 上面的-e ‘/pattern/’ 也可以使用—expression=’/pattern/’来替代

案例6:将另一个文件的内容读取到指定位置

File.txt的内容就是:hello,world
[root@apache ~]# sed '/huaxue/r file.txt' test.txt
jack huaxue 90
hello,world
tom huaxue 70
hello,world
jane shuxue 99
tony shuxue 80
[root@apache ~]#

案例7:把匹配到的行写入到新的文件中

//将test.txt文件中包含有’jane’的行,都写入到file.txt文件里
[root@apache ~]# sed '/jane/w file.txt' test.txt
jack huaxue 90
tom huaxue 70
jane shuxue 99
tony shuxue 80
[root@apache ~]# cat file.txt
jane shuxue 99
[root@apache ~]#

案例8:在匹配到的行后面追加内容

字符追加命令:a\ //一定要注意,标准的写法是a后面有一个\,我测试过来,没有也是可以的。

//将”how are you?”追加到test.txt文件中包含’jane’的行的后面:
[root@apache ~]# sed '/^jane/a Hello,how are you?' test.txt
jack huaxue 90
tom huaxue 70
jane shuxue 99
Hello,how are you?
tony shuxue 80
[root@apache ~]#
// 还有一个i\命令,和a\命令有点类似,i\是把其后面的字符插入到匹配行的前面,
// a\把内容插入到匹配行的后面。

案例9:变形操作

//将test.txt文件中所有的a都转换成大写的:
[root@apache ~]# sed 'y/a/A/' test.txt
jAck huAxue 90
tom huAxue 70
jAne shuxue 99
tony shuxue 80
[root@apache ~]#

案例10:取反操作!

//把不包含jack的行都删除:
[root@apache ~]# sed '/jack/!d' test.txt
jack huaxue 90
[root@apache ~]#

案例11:直接修改文件

sed –i ‘s/tset/test/g’ /etc/test.txt

使用”-i”可以把/etc/test.txt文件中的tset替换成test,执行成功后,文件中也改过来了。

常用元字符集说明:

^

锚定行的开始,例如“/^sed/”,则是匹配所有以sed开头的行

$

锚定行的结尾,例如“/sed$/”会匹配所有以sed结尾的行

.

匹配一个非换行符的字符。如:/s.d/,匹配s后面跟任意一个字符,然后再接上一个d

*

匹配0个或多个字符。如:/s*d/ 匹配s和d之间有0个或任意多个字符的字符串

[]

匹配一个指定范围内的字符。如:/[Ss]ed/可以匹配Sed和sed

[^]

匹配一个不在指定范围内的字符。如:/[^a-d]ed/可以匹配不是以a到d开头的,后面再接上一个ed的字符串

\(..\)

将匹配上的字符保存起来。如:’s/\(love\)able/\1rs/p’ 会将该行匹配到的loveable中的love保存起来,并用1来标记,最后再把loveable替换成lovers。

&

保存搜索的字符串,用来替换其他字符。如:’s/love/I & you/’ 会将love替换成“I love you”

\<

锚定单词的开始。如:/\<Hell/表示匹配以Hell开头的单词

\>

锚定单词的结尾。匹配以指定字符串结尾的单词。

a\{m\}

匹配字母a要重复m次。如:’/a\{5\}/’ 匹配包含有5个a的行

a\{m,\}

字母a至少要重复m次

a\{m,n\}

字母a重复m到n次

相关推荐