linux三剑客之sed

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列之后)

  1. 存在sg,不存在MN,表示全局变化
  2. 存在sg,存在M,不存在N,表示变化第M行
  3. 存在sg,存在N,不存在M,表示变化从第N列之后
  4. 存在sg,存在MN,表示变化第M行,从第N列开始
  5. 存在s,不存在g,不存在MN,表示第一列
  6. 存在s和M,不存在g,表示 第M行第一列
  7. 不存在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$将不会输出读取的文件

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值