sed高阶用法sed编辑器
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
1.sed编辑器工作流程
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed的工作流程主要包括读取、执行和显示三个过程:
- 读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
模式空间和保持空间
模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间
保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,而是需要sed命令来进行处理
模式空间与保持空间的关系
模式空间:相当于流水线,文本行再模式空间中进行处理;
保持空间:相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。
sed命令参数
-n 使用安静模式.则只有经过sed特殊处理的哪一行才会被列出来
-e 传送带(前面执行完传递给后面)
-f 跟随脚本文件名
-r 脱意
-i 直接修改读取文件
sed命令详解替换标记
g:表示行内全面替换
w:表示把行写入一个文件
x:表示互换模式空间的文本和保持空间的文本
y:表示把一个字符翻译为另外的字符(不用于正则表达式)
单行模式空间
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除,所以 d 后面通常不接任何东东;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g
n:读取下一个输入行, 用下一个命令处理新的行
y:把一个或多个字符替换成另一个字符
示例:
#初始root@localhost ~]# cat test a b cbcd//a的用法#选择行下添加[root@localhost ~]# sed '2a123321' testa b cb123321cd#在匹配的参数下一行进行添加[root@localhost ~]# sed '/c/a123321' testa b c123321bc123321d//c的用法[root@localhost ~]# cat testa b cbcd#选择行进行修改[root@localhost ~]# sed '3caaa' test a b cbaaad#将匹配到的参数进行修改[root@localhost ~]# cat test a b cbcd[root@localhost ~]# sed '/d/caaa' test a b cbcaaa//d的用法[root@localhost ~]# cat test a b cbcd#将第一行删除[root@localhost ~]# sed '1d' test bcd#将匹配到的行删除[root@localhost ~]# cat test a b cbcd[root@localhost ~]# sed '/b/d' test cd//i的用法#选择行进行插入[root@localhost ~]# cat test a b cbcd[root@localhost ~]# sed '3i123' test a b cb123cd#在匹配的参数前一行进行插入、[root@localhost ~]# cat test a b cbcd[root@localhost ~]# sed '/b/i123' test 123a b c123bcd//p的用法[root@localhost ~]# cat test a b cbcd[root@localhost ~]# sed -n '/a/p' test //-n选项:只显示匹配处理的行(否则会输出所有)(也就是关闭默认的输出)a b c//s的用法#将匹配的每行里的第一个参数进行替换[root@localhost ~]# cat test a b cbcd[root@localhost ~]# sed 's/b/c/' test a c cccd#如果一行类出现多次参数,就会出现以下问题[root@localhost ~]# cat test a b cbcdaaac[root@localhost ~]# sed 's/a/c/' test c b cbcdcacc#想要全部替换需要在最后加上g[root@localhost ~]# cat test a b cbcdaaac[root@localhost ~]# sed 's/a/c/g' test c b cbcdcccc//n的用法,n读取下一个输入行#此处的n不是sed -n的n的那种用法[root@localhost ~]# cat test a b cbcdaaac[root@localhost ~]# sed -n '/a/n;p' test //匹配到的参数下面的所有行bcdac//y的用法#将匹配到的整行都进行修改[root@localhost ~]# cat test a b cbcdaaac[root@localhost ~]# sed '5y/a/C/' test a b cbcdCCac
多行空间模式
N:读取匹配到的行的下一行追加至模式空间
P:打印模式空间开端至\n内容,并追加到默认输出之前
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环
示例:
[root@localhost ~]# cat testhere are examples of the UNIXSystem. Where UNIXSystem appears, it should be the UNIXOperating System.[root@localhost ~]# sed '/UNIX$/{N;/\nSystem/s// Operating &/;P;D}' testhere are examples of the UNIX Operating System. Where UNIX Operating System appears, it should be the UNIXOperating System.
常用命令
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
示例
[root@localhost ~]# cat 123 121122111222#匹配有1的行,h将将模式空间的内容追加到保持空间,d删除模式空间的内容[root@localhost ~]# sed '/1/{h;d}' 123 222222此时模式空间:空保持空间:111111#匹配有2的行,G将保持空间的内容追加到模式空间[root@localhost ~]# sed '/1/{h;d};/2/{G}' 123 212211222111此时模式空间:212211222111