文本处理sed
作者:互联网
目录
sed简介
1、sed 是什么
sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大,可以在大多数操作系统中使用。
sed 的出现作为 grep 的继任者,与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。sed 基本上就是在玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。
2、sed 工作原理
sed 会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed基本命令
命令格式
语法:
sed [options] '[地址定界] command' file(s)
常用选项options
- -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
- -e:多点编辑,对每行处理时,可以有多个Script
- -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
- -r:支持扩展的正则表达式
- -i:直接将处理的结果写入文件
- -i.bak:在将处理的结果写入文件之前备份一份
地址定界
默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-10行,偶数行,或者是包含"hello"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"。
- 不给地址:对全文进行处理
- 单地址:
- '#': 指定的行
- /pattern/:被此处模式所能够匹配到的每一行
- 地址范围:
- '#', #
- '#', +#
- /pat1/,/pat2/
- '#',/pat1/
- ~:步进
- sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)
- sed -n '2~2p' 只打印偶数行
编辑命令command
- d:删除模式空间匹配的行,并立即启用下一轮循环
- p:打印当前模式空间内容,追加到默认输出之后
- a:在指定行后面追加文本,支持使用\n实现多行追加
- i:在行前面插入文本,支持使用\n实现多行追加
- c:替换行为单行或多行文本,支持使用\n实现多行追加
- w:保存模式匹配的行至指定文件
- r:读取指定文件的文本至模式空间中匹配到的行后
- =:为模式空间中的行打印行号
- !:模式空间中匹配行取反处理
- s///:查找替换,支持使用其它分隔符,如:s@@@,s###;
- 加g表示行内全局替换;
- 在替换时,可以加一下命令,实现大小写转换
- \l:把下个字符转换成小写。
- \L:把replacement字母转换成小写,直到\U或\E出现。
- \u:把下个字符转换成大写。
- \U:把replacement字母转换成大写,直到\L或\E出现。
- \E:停止以\L或\U开始的大小写转换
用法演示
常用选项options演示
[root@localhost ~]# cat z
aaa
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '/aaa/p' z #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed -n '/aaa/p' z #-n不显示没匹配的行
aaa
[root@localhost ~]# sed -e 's/a/A/' -e 's/b/B/' z #-e多点编辑
Aaa
Bbbb
ccc
AABBCCDD
[root@localhost ~]# cat sed.txt
s/A/a/g
[root@localhost ~]# sed -f sed.txt z #-f使用文件处理
aaa
bbbb
ccc
aaBBCCDD
[root@localhost ~]# sed -i.bak 's/a/A/g' z #-i直接对文件进行处理
[root@localhost ~]# cat z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# cat z.bak
aaa
bbbb
ccc
AABBCCDD
地址界定演示
[root@localhost ~]# cat z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed -n 'p' z #不指定行,打印全文
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '2s/b/B/g' z #替换第2行的b->B
AAA
BBBB
ccc
AABBCCDD
[root@localhost ~]# sed -n '/AA/p' z #打印AA的行
AAA
AABBCCDD
[root@localhost ~]# sed -n '1,2p' z #打印1-2行
AAA
bbbb
[root@localhost ~]# sed -n '/AAA/,/DD/p' z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed -n '2,/DD/p' z
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '2~2s/[bB]/Z/g' z #将偶数行的b或A替换为Z
AAA
ZZZZ
ccc
AAZZCCDD
编辑命令command演示
[root@localhost ~]# cat z
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '2d' z #删除第2行
AAA
ccc
AABBCCDD
[root@localhost ~]# sed -n '2p' z #打印第2行
bbbb
[root@localhost ~]# sed '2a123' z #在第2行后加123
AAA
bbbb
123
ccc
AABBCCDD
[root@localhost ~]# sed '1i123' z #在第1行前加123
123
AAA
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '3c123\n456' z #替换第3行内容
AAA
bbbb
123
456
AABBCCDD
[root@localhost ~]# sed -n '3w/root/z3' z #保存第3行的内容到z3文件中
[root@localhost ~]# cat z3
ccc
[root@localhost ~]# sed '1r/root/z3' z #读取z3的内容到第1行后
AAA
ccc
bbbb
ccc
AABBCCDD
[root@localhost ~]# sed '=' z #=打印行号
1
AAA
2
bbbb
3
ccc
4
AABBCCDD
[root@localhost ~]# sed -n '2!p' z #打印除了第2行的内容
AAA
ccc
AABBCCDD
[root@localhost ~]# sed 's@[a-z]@\u&@g' z #将全文的小写字母替换为大写字母
AAA
BBBB
CCC
AABBCCDD
sed高级编辑命令
选项:
- h:把模式空间中的内容覆盖至保持空间中
- H:把模式空间中的内容追加至保持空间中
- g:从保持空间取出数据覆盖至模式空间
- G:从保持空间取出内容追加至模式空间
- x:把模式空间中的内容与保持空间中的内容进行互换
- n:读取匹配到的行的下一行覆盖 至模式空间
- N:读取匹配到的行的下一行追加 至模式空间
- d:删除模式空间中的行
- D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
1.一个案例+示意图演示
案例:倒序输出文本内容
[root@localhost ~]# cat num.txt
one
two
three
[root@localhost ~]# sed '1!G;h;$!d' num.txt
three
two
one
示意图如下:
[root@localhost ~]# cat z
1
2
11
22
111
222
#将匹配到的1复制到保持空间,并删除模式空间的1,再匹配2时,将保持空间的文本追加到匹配的2后面
[root@localhost ~]# sed '/1/{h;d};/2/{G}' z
2
1
22
11
222
111
[root@localhost ~]# cat c
hello world 1
hello world 2
hello world 3
hello world 4
happy
#将多个空行减少到一行
[root@localhost ~]# sed '/^$/{N;/^\n$/d;}' c
hello world 1
hello world 2
hello world 3
hello world 4
happy
[root@localhost ~]# sed '/^$/{N;/^\n$/D;}' c
hello world 1
hello world 2
hello world 3
hello world 4
happy
[root@localhost ~]#
标签:AAA,AABBCCDD,文本处理,sed,localhost,root,ccc 来源: https://www.cnblogs.com/z696/p/16698553.html