Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
参数说明:
- -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
- -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- -h或--help 显示帮助。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -V或--version 显示版本信息。
- -i 表示永久修改
- -i(后缀名) 修改前进行备份
- -e 执行多条sed命令
动作说明:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- w:另存文件
- 5w:将文件的第五行内容存在另一个文件中
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
补充:(后面均有对应运行)
- 1~2{sed-commands}表示奇数行 2~2表示偶数行
- 2,5{sed-commands} 表示2到5行
- 10,+20{sed-commands} 表示10-30行
- 10,${sed-commands} 表示10到最后一行
- /hello/ 表示匹配有hello的行
- /hello/,/this/ 匹配从hello到good的行,包括这两行,(匹配最短,既是当后面也出现同样的字段的时候,只匹配前面的,只能是后面出现同样两个匹配字段的时候,能够匹配到内容)
- /hello/,5{sed-commands} 匹配hello行第5行,如果后面还有相关的带有hello的行同时匹配
语法:
Sed [options] [sed-command] [input-file]
实例
使用到的文本文件如下:
查看sed的版本号
a表示追加,在文件a.txt的第二行后面追加一行数据“106 english”
i表示插入,在第二行插入一行数据“this is the inserted data”
一次性追加两行内容,可以使用\n(表示换行)
d表示删除,删除第二行内容
删除2,5行内容
-
2,5{sed-commands} 表示2到5行
-
10,+20{sed-commands} 表示10-30行
-
10,${sed-commands} 表示10到最后一行
p和-n的使用
单独使用p的时候,表示将全部输出,并且将所要输出的内容再打印一份输出
当结合-n使用的时候,只是打印想要打印的内容,如下只打印第二行内容
p表示打印,通常与-n一起运行 10,+5表示10到15行,包含10和15
1~2{sed-commands}表示奇数行 2~2表示偶数行
匹配行
/hello/ 表示匹配有hello的行
/hello/,/this/ 匹配从hello到good的行,包括这两行,(匹配最短,既是当后面也出现同样的字段的时候,只匹配前面的,只能是后面出现同样两个匹配字段的时候,能够匹配到内容)
举例:当内容如下表示,hello全部都在上边,当第一次出现good的时候,下面虽然还有good但是却没有出现hello字段,所以此时显示内容只有第一个good
当内容如下的时候,匹配到第一次good的时候,后面还有对应的同时两字段都出现的内容,所以也可匹配到第二次good
当后面再有hello的时候,同样可以匹配hello,如果有good匹配到good所在行,如果没有good,匹配到最后
/hello/,5{sed-commands} 匹配hello行第5行,如果后面还有相关的带有hello的行同时匹配
删除带有hello的行
c表示替换
s表示文本替换 其中的g表示全局替换标志,不是命令
格式:sed ‘s# # #g’ 文件名
替换命令s,全局g
总结:格式:sed 'Ms###Ng' (M行,第N列之后)
- 存在sg,不存在MN,表示全局变化
- 存在sg,存在M,不存在N,表示变化第M行
- 存在sg,存在N,不存在M,表示变化从第N列之后
- 存在sg,存在MN,表示变化第M行,从第N列开始
- 存在s,不存在g,不存在MN,表示第一列
- 存在s和M,不存在g,表示 第M行第一列
- 不存在s,不管是否存在Ng都不会变化
当在使用全局变量g的时,如果连同i一起使用,表示忽略大小写
13.-i表示永久修改 前面也有提到i表示插入,写在sed的里面
-i 也可以将已经存在的文件,再修改之前进行备份,通过查看可以看到多了.bak文件
当存在变量的时候,如果想要在sed中使用变量,需要注意引号的使用
如果想要使用单引号,可以在sed前面使用eval,相当于先解析在执行
w的相关使用
w表示另存文件,如下将文件a.txt另存为out.txt 并且源文件依然存在
5w表示将文件的第五行存在另一个文件中
当想要把一些部分的内容,另存到另外一个文件中,前面是用命令,后面是用另存的命令与文件名
在下面的示例中,可以看到有没有;另存文件中的结果不同。原因是当没有分号的时候,w表示一个写的标志 有分号的时候,w表示一个命令,相当于两个命令连在一起
当使用;的时候
替换字符的使用
-r表示使用扩展正则表达式
=的使用,这里表示获取行号,默认换行
如果想让输出不换行,可以使用管道符,再结合sed使用,注意下面的N;一定要有,或者结合cat -n使用
-e执行多条sed命令
-f执行sed脚本,脚本的后缀名为.sed,内容为需要执行的内容
格式:sed -f 脚本文件 执行的文件名
{}的使用
打印不可见字符l
不可见字符$,文件结尾都有一个$字符,当文件内容有空行的时候显示$
-y转换字符,如下,将hello中对应的字符转换成HELLP,对应转换,两者长度要相同
或者使用tr进行转换,这个不要求长度相同,如下,前边是hello,后面是HELL,会将能对应的相对应,无法对应的全部替换成最后一个字符,这里将hell->HELL o-->L
q表示跳出循环
r表示从文件中读取数据,两个文件合并
要使用$r,如果使用r$将不会输出读取的文件