linux中sed指令的使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u012062455/article/details/79309331

声明

原文引用自鸟哥私房菜。

sed指令是对行来进行处理,结合正则表达式在文件内容处理方面可以发挥强大的作用。

参数详解

[root@linux ~]# sed [-nefr] [动作]
参数: 
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 
 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过 
 sed 特殊处理的那一行(或者动作)才会被列出来。 
-e :直接在指令列模式上进行 sed 的动作编辑; 
-f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 
 sed 动作; 
-r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法) 

动作说明: [n1[,n2]]function 
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 
 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 

function 有底下这些: 
a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~ 
c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行! 
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; 
i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行); 
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~ 
s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦! 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

参数d,以行为单位,删除功能

删除2~5行,中,2,5,行包括在内

[root@localhost ~]# nl /etc/passwd | sed '2,5d'
上面的指令完整的写法是要加参数e的,但是由于只需要执行一条指令,所以可以省略,但是如果是有多条指令,每条指令都需要加上-e参数(下面的指令都省略了-e参数)
[root@localhost ~]# nl /etc/passwd | sed -e '2,5d'
[root@localhost ~]# nl /etc/passwd | sed -e '2,5d' -e '8,10d'
 
 
  • 1
  • 2
  • 3
  • 4

删除第2行

[root@localhost ~]# nl /etc/passwd | sed '2d'
 
 
  • 1

删除3到最后一行

[root@localhost ~]# nl /etc/passwd | sed '3,$d'
 
 
  • 1

注意:sed后面接动作,务必用单引号括住

参数a i 新增内容

在第二行后新增内容

[root@localhost ~]# nl /etc/passwd | sed '2a drink tea'
 
 
  • 1

在第二行前,新增内容

[root@localhost ~]# nl /etc/passwd | sed '2i drink tea'
 
 
  • 1

新增多行内容,主要要是用到\或者回车(新增的内容使用单引号,如果要想使用回车来实现新增多行,注意另外一个单引号别写出来,否则就直接执行指令了)来新增多行内容

[root@localhost ~]# nl /etc/passwd | sed '2a drink tea ....\
drink bear?'

 
 
  • 1
  • 2
  • 3

以行为单位替换c和显示p

替换2到5行

[root@localhost ~]# nl /etc/passwd | sed '2,5c 2-5 no data'
 
 
  • 1

显示10~20行

[root@localhost ~]# nl /etc/passwd | head -n 20 | tail -n 10
也可以使用
[root@localhost ~]# nl /etc/passwd | sed -n '11,20p'
 
 
  • 1
  • 2
  • 3

记得要加上-n变成silent模式,只输出经过sed特殊处理的。否则会有重复输出。

参数s 查找和替换

sed ‘s/要被替换的字符串/新的字符串/g’

[root@localhost ~]# /sbin/ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 912.168.1.1  netmask 255.255.255.0  broadcast 912.168.1.255
[root@localhost ~]# /sbin/ifconfig ens160 | grep 'inet '
        inet 912.168.1.1  netmask 255.255.255.0  broadcast 912.168.1..255
[root@localhost ~]# /sbin/ifconfig ens160 | grep 'inet ' | sed 's/^.*addr//g'
        inet 912.168.1.1  netmask 255.255.255.0  broadcast 912.168.1.255
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将ip前面的部分删除

[root@localhost ~]# /sbin/ifconfig ens160 | grep 'inet ' | sed 's/^.*inet//g'
 912.168.1.1  netmask 255.255.255.0  broadcast 912.168.1.255
 
 
  • 1
  • 2

删除ip后面的

[root@localhost ~]# /sbin/ifconfig ens160 | grep 'inet ' | sed 's/^.*inet//g' | sed 's/netmask.*$//g'
 
 
  • 1

去除注释行

[root@localhost ~]# cat /etc/man_db.conf | grep 'MAN' | sed 's/#.*$//g'
 
 
  • 1

注释行变成了空格,将空格删除

[root@localhost ~]# cat /etc/man_db.conf | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
 
 
  • 1

使用sed直接修改文件

将所有.修改成!

[root@localhost tmp]# sed -i 's/\./\!/g' regular_express.txt
 
 
  • 1

在最末尾添加# this is a test一行注释。

[root@localhost tmp]# sed -i '$a # this is a test' regular_express.txt
 
 
  • 1
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e9f16cbbc2.css" rel="stylesheet">
                </div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值