Linux重要命令-sed

https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html

https://coolshell.cn/articles/9104.html

http://man.linuxde.net/sed

https://www.jianshu.com/p/9d9a34e2b2dd

https://blog.csdn.net/liuchunming033/article/details/52355111

https://qianngchn.github.io/wiki/4.html

https://hui-liu.github.io/blog/Linux%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86%E4%B8%89%E5%89%91%E5%AE%A2%E4%B9%8Bsed/

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

二、Sed命令格式

sed [options] 'command' file(s) 
sed [options] -f scriptfile file(s)
常用选项:

-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。       
常用命令:

a  ∶新增,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
b  ∶lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
c  ∶取代,c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d  ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
D  ∶删除模板块的第一行
g  ∶获得内存缓冲区的内容,并替代当前模板块中的文本
G  ∶获得内存缓冲区的内容,并追加到当前模板块文本的后面
h  ∶拷贝模板块的内容到内存中的缓冲区
H  ∶追加模板块的内容到内存中的缓冲区
i  ∶插入,i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
l  ∶列表不能打印字符的清单
n  ∶读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
N  ∶追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
p  ∶打印模板块的行,即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
p  ∶P(大写) 打印模板块的第一行
q  ∶退出Sed
r  ∶file 从file中读行
s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法
t  ∶label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
T  ∶label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾
w  ∶file 写并追加模板块到file末尾。 W file 写并追加模板块的第一行到file末尾
!  ∶表示后面的命令对所有没有被选定的行发生作用
=  ∶打印当前行号码
#  ∶把注释扩展到下一个换行符以前 
 

 

三、应用举例
1、删除操作:d命令


[root@localhost Linux] # sed '1d' ab             #删除第一行 
[root@localhost Linux] # sed '$d' ab             #删除最后一行
[root@localhost Linux] # sed '1,2d' ab           #删除第一行到第二行
[root@localhost Linux] # sed '2,$d' ab           #删除第二行到最后一行

[root@localhost Linux]sed '/^$/d' file              #删除空白行

[root@localhost Linux]#sed -e ‘/oldboy/d’ test.txt  #删除字符串oldboy(没改文件内容,在输出打印时删掉

[root@localhost Linux]sed '/^test/'d file            #删除文件中所有开头是test的行


2、显示某行

[root@localhost Linux] # sed -n '1p' ab          #显示第一行 
[root@localhost Linux] # sed -n '$p' ab          #显示最后一行
[root@localhost Linux] # sed -n '1,2p' ab        #显示第一行到第二行
[root@localhost Linux] # sed -n '2,$p' ab        #显示第二行到最后一行

[root@localhost Linux]#sed -n ‘1,$’p passwd                 //打印全部的行

[root@localhost Linux]#sed -e ‘2,5’p -e ‘/root/’p -n passwd        //打印第二行到第五行以及包含root的行 ,-e :编辑 //在一个表达式中执行多个动作!


3、增加一行或多行字符串

[root@localhost Linux]# cat ab
    Hello!
    Linux is me,welcome to my blog.
    end
[root@localhost Linux] # sed '1a drink tea' ab  #第一行后(亦即是加在第二行)增加字符串"drink tea"
    Hello!
    drink tea
    Linux is me,welcome to my blog. 
    end
[root@localhost Linux] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
    Hello!
    drink tea
    Linux is me,welcome to my blog.
    drink tea
    end
    drink tea
[root@localhost Linux] # sed '1a drink tea\nor coffee' ab   #第一行后增加多行,使用换行符\n
    Hello!
    drink tea
    or coffee
    Linux is me,welcome to my blog.
    end

 

3.1、如果是要增加两行以上,在第二行后面加入两行字,例如『Drink tea or .....』与『drink beer?』

复制代码

[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

复制代码

每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。

3.2、在第二行前增加字符串

nl /etc/passwd | sed '2i drink tea' 

 


4、替换一行或多行

[root@localhost Linux] # sed '1c Hi' ab                #第一行代替为Hi
    Hi
    Linux is me,welcome to my blog.
    end
[root@localhost Linux] # sed '1,2c Hi' ab             #第一行到第二行代替为【Hi】
    Hi
    end


5、替换

注意:如果你要使用单引号,那么你没办法通过\’这样来转义,就有双引号就可以了,在双引号内可以用\”来转义。

5.1、替换操作:s命令

[root@localhost Linux] #sed -n 's/test/TEST/p' file    #-n选项p命令一起使用表示只打印那些发生替换的行

[root@localhost Linux]sed 's/book/books/' file   

[root@localhost Linux]#sed -i 's/book/books/g' file     #直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books

5.2、全面替换标记g

格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)
[root@localhost Linux] # sed -n '/Linux/p' ab | sed 's/Linux/bird/g'    #替换Linux为bird
[root@localhost Linux] # sed -n '/Linux/p' ab | sed 's/Linux//g'        #删除Linux

[root@localhost Linux]#sed ‘1,20s/root/toor/g’ passwd  #使用后缀 /g 标记会替换每一行中的所有匹配

[root@localhost Linux]#sed -r ‘1,10s/ro+/r/g’ passwd                       //因为表达式中有 + 所以必须要使用 -r 去脱意

[root@localhost Linux]#sed ‘s/[a-zA-Z]//g’ passwd            //删除passwd中所有的英文字符(替换成空即为删除)

当需要从第N处匹配开始替换时,可以使用 /Ng:

echo sksksksksksk | sed 's/sk/SK/2g'   #替换每一行的第4个以后的sk
skSKSKSKSKSK

echo sksksksksksk | sed 's/sk/SK/3g'    #替换每一行的第4个以后的sk
skskSKSKSKSK

替换每一行的第n个

echo sksksksksksk | sed 's/sk/SK/3'    #替换每一行的第3个s

skskSKsksksk

5.3、定界符

以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:

sed 's:test:TEXT:g'
sed 's|test|TEXT|g'

[root@localhost Linux]# head passwd | sed -r 's#([^:]+):(.*):([^:]+)#\3:\2:\1#g'

定界符出现在样式内部时,需要进行转义:

sed 's/\/bin/\/usr\/local\/bin/g'

5.4、数据的搜寻与替换

[root@www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....
本机的ip是192.168.1.100。

5.4.1、将 IP 前面的部分予以删除

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'

192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

 

接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

5.4.2、将 IP 后面的部分予以删除

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

 


6、直接修改文件内容(危险动作)

[root@localhost Linux] # sed -i '$a bye' ab         #由于$ 代表的是最后一行,而 a 的动作是新增在文件。因此在ab中最后一行直接新增【bye】
[root@localhost Linux] # cat ab
     Hello!
     Linux is me,welcome to my blog.
     end
     bye

[root@localhost Linux]$ sed -i "s/my/Hao Chen's/g" pets.txt


7、删除匹配行

sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)

#sed -i ‘5000,$’d logfile i:修改内容   d:删除动作 //删除5000行到末尾的行

#sed -i ‘/user2/’d logfile          //删除user2这个关键字的行

 

替换匹配行中的某个字符串

sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
--------------------- 

8.匹配字符串

#sed -n ‘//‘p file             // 内填写需要匹配的字符串 例如: #sed -n ‘/root/’p /etc/passwd :匹配包含字符串root的行!(使用grep 匹配则是#grep ‘root’ /etc/passwd

sed -n '/root/'p passwd  

#-n 取消默认输出,p打印包含root字符串的行

 

9.大写的i匹配不区分大小写的字符串

root@zhouwj-virtual-machine:~# cat test.txt 
oldiby
OLDBOY123
OLdboY124
root@zhouwj-virtual-machine:~# sed -n '/oldboy/'Ip test.txt 
OLDBOY123
OLdboY124

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值