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可以有以下三种表示方法:
- StartLine,EndLine
比如: 1,100 - /RegExp/ 正则表达式,注意正则表达式必须使用//包围起来;
比如: /^root/ - /RegExp1/,/RegExp2/ 从第一次被RegExp1匹配到的行开始,到第一次被RegExp2匹配到的行结束,这中间的所有行;
- LineNumber 精确到特定的行;
- $ 表示文件的最后一行;
- 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次
相关推荐
-
第18问:MySQL CPU 高了,怎么办?2025-02-24 10:27:18
-
mysql索引类型 normal, unique, full text
mysql索引类型 normal, unique, full text2025-02-24 10:05:05 -
uwsgi+django+nginx 搭建部分总结2025-02-24 10:03:33
-
使用Docker配置Nginx环境部署Nextcloud2025-02-24 10:02:03
-
Nginx安装和怎么使用2025-02-24 10:00:45