sed进阶用法
sed基本介绍
sed是一种流编辑器,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等
ed数据处理原理
sed的选项、命令、替换标记
命令介绍
sed的命令格式:sed [options] 'command' file(s);
sed的脚本格式:sed [options] -f scriptfile file(s);
-e :直接在命令行模式上进行sed动作编辑,此为默认选项;
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容;
-n :只打印模式匹配的行;
-r :支持扩展表达式;
-h: 或–help:显示帮助;
-V: 或–version:显示版本信息
a\ 在当前行下面插入文本;
i\ 在当前行上面插入文本;
c\ 把选定的行改为新的文本;
d 删除,删除选择的行;
D 删除模板块的第一行;
s 替换指定字符;
h 复制模式空间的内容到内存中的保存空间;
g 获得内存缓冲区的内容,并覆盖当前模板块中的文本;
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面;
l 列表不能打印字符的清单;
n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
p 打印模板块的行。 P(大写) 打印模板块的第一行;
基础命令
#a 在当前匹配到的行下面在添加
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
[root@localhost ~]# sed '/a/acccc' 123
aaaa
cccc
dddd
#i 在当前匹配到的文本上一行添加
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
[root@localhost ~]# sed '/a/icccc' 123
cccc
aaaa
dddd
#c 把sed匹配到的文本修改
[root@localhost ~]# cat 123
aaaa
dddd
[root@localhost ~]# sed '/a/c123' 123
123
dddd
bbbb
#d 把sed匹配到的行删除;D同样也是删除匹配到的行,在功能上差不多,但是D他会删除停止在换行符前面。
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
[root@localhost ~]# sed '/a/d' 123
dddd
bbbb
sed模式空间和保持空间介绍
sed 之 模式空间 & 保持空间. 保持空间:作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间。. 由上面定义可以知道,模式空间和保持空间是两个独立的缓冲区,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。. 通过模式匹配到的行被读入模式空间中。. 用来进行进一步的操作;在多行模式中, 'n’可以用来和模式空间 (N命令的结果)的任意换行符匹配,单模式空间底部的换行符除外 。. ^匹配多行的首,$匹配多行的尾,不是每行的行首和行尾。. 可以通过h,H,g,G与模式空间进行交互。
h命令是将当前模式空间中内容覆盖至保持空间;
H命令是将当前模式空间中的内容追加至保持空间
g命令是将当前保持空间中内容覆盖至模式空间,
G命令是将当前保持空间中的内容追加至模式空间
高级命令
n命令
- 如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:
[root@localhost ~]# cat 123
test
aa
[root@localhost ~]# sed '/test/{n;s/bb/}' 123
test
bb
N命令
N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
fffff
[root@localhost ~]# sed -n 'N;P' 123
aaaa
cccc
[root@localhost ~]#
h命令
是将模式空间的内容覆盖到保持空间。
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
[root@localhost ~]# sed '/aaaa/{h;d};/bbbb/{G}' 123
dddd
bbbb
aaaa
cccc
H命令
H命令是将当前模式空间中的内容追加至保持空间
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
[root@localhost ~]#
#H 是把模式空间的aaaa追加到保持空间里面,然后在匹配一个dddd把他也匹配到模式空间里面,然后G把保持空间里的aaaa追加到dddd后面模式空间也就是下面显示的
[root@localhost ~]# sed '/aaaa/{H;d};/dddd/{G}' 123
dddd
aaaa
bbbb
cccc
g命令
g命令是吧保持空间的内容覆盖到模式空间
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
# g 可以很明显的看到这里用h把aaaa覆盖到保持空间,然后用g把保空间的aaaa覆盖到模式空间,因为我匹配了一个dddd所以就是覆盖了一个dddd。
[root@localhost ~]# sed '/^a/{h};/^d/{g}' 123
aaaa
aaaa
bbbb
cccc
[root@localhost ~]#
[root@localhost ~]# sed '/^a/{h};/^c/{g}' 123
aaaa
dddd
bbbb
aaaa
[root@localhost ~]#
G命令
G 命令是吧保持空间的内容追加到模式空间
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
# G 可以看到h把模式空间的aaaa覆盖到保持空间,也就是说现在保持空间里面有aaaa,然后在匹配cccc,用G将保持空间的aaaa追加到cccc后面。
[root@localhost ~]# sed '/^a/{h};/^c/{G}' 123
aaaa
dddd
bbbb
cccc
aaaa
[root@localhost ~]#
p和P命令
p 打印模式空间的行。 P(大写) 打印模式空间的第一行;
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
# 这里匹配到一个aaaa所以p就多打印了一行
[root@localhost ~]# sed '/aaaa/{p}' 123
aaaa
aaaa
dddd
bbbb
cccc
#P 是只打印模式空间的第一行,通常和-n一起用,-n 选项会禁止 sed 输出
[root@localhost ~]# sed -n '/aaaa/{P}' 123
aaaa
y命令
y命令就是把匹配到模式空间的内容替换掉
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
# y 这里我首先把1,4行的内容匹配到模式空间,然后用y给他们全部替换成大写;你要替换到多少为大写字母就要打到多少位。
[root@localhost ~]# sed '1,4y/abcde/ABCDE/' 123
AAAA
DDDD
BBBB
CCCC
[root@localhost ~]#
x命令
x命令是互换模式空间和保持空间的内容
[root@localhost ~]# cat 123
aaaa
dddd
bbbb
cccc
[root@localhost ~]#
[root@localhost ~]# sed '/aaaa/{h};/cccc/{x}' 123
aaaa
dddd
bbbb
aaaa