https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html
https://coolshell.cn/articles/9104.html
https://www.jianshu.com/p/9d9a34e2b2dd
https://blog.csdn.net/liuchunming033/article/details/52355111
https://qianngchn.github.io/wiki/4.html
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