三剑客命令之Sed的用法总结
sed是Linux系统中最为广泛使用的命令行编辑器,sed本身也是一个管道命令,可将数据进行替换/删除/新增/选取等功能。sed命令的执行过程大致如下:
1)一次从输入中读取一行数据;2)根据所提供的编辑器命令匹配数据;3)按照命令修改流中的数据;4)将新的数据输出到STDOUT
sed命令格式如下:
[root@centos7-magedu ~]# sed [-nefr] [动作]
-n 静默模式,只有经过sed特殊处理的行才能够显示出来;
-e 命令行模式的sed编辑,常用来分隔多个动作;
-f 直接将sed的动作写入一个文件,-f filename则可执行filename内的sed命令
-r 支持拓展正则表达式(默认为基本正则表达式)
-i 修改文件内容并保存,后紧跟.bak可对将原文件另存为(filename.bak)(任意名称均可)
function 有这些参数:
a:行后新增,往往接字符串
c:替换,往往与地址定界配合使用
d:删除,通常其后不接任何参数
i:行前新增,字符串出现在当前行的上一行
p:打印,如只显示第二行 sed -n ‘2p’
s:替换,通常与正则表达式配合使用,多用于文本行内的过滤和字符串替换
下面重点说明下 sed命令下的替换选项:
1.替换标记
使用sed将文本内的test替换为trial
由此看出,默认情况下只替换每行中出现的第一处,下面有4中可用的标记:
1>数字,表明新文本将替换第几处模式匹配的地方;2>g,表明新文本将替换所有匹配的文本;3>p,表明原先行的内容要打印;4>w file,将替换的结果写到文件中
2.替换字符
当用传统的/替换文件中的路径名时,往往比较麻烦,例如用C shell替换/etc/passwd文件中的bash shell,必须这么做:
sed ‘s/\/bin\/bash/\/bin\/csh/’ /etc/passwd,这通常会带来困惑和错误,此时可用@替代
sed ‘s@/bin/bash@/bin/csh@’ /etc/passwd
3.过滤文本中的单词
例题:用sed命令统计/etc/init.d/functions文件中每个单词的出现次数,并排序
分析:对单行进行正向截取很难,因为‘s@.*[^[:alpha:]](\<[[:alpha:]]+\>).*@\1@p’一行只能替换一个单词,所以只能用反向截取,考虑将除了单词外的字符转换成换行:
第二部分介绍高级编辑命令
P:打印模式空间开端至\n内容,并追加到默认输出之前
h:把模式空间的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d:删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间启动新循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环。
上述高级编辑命令可进行如下组合:
'n;p' 输出偶数行
'n;d' 只显示奇数行
'g' 所有行变为空行
'$!N;$!D' 输出倒数后两行
'N;D'只输出最后一行
'1!G;h;$!d'倒序输出
例:将文本文件的n和n+1行合并为一行,n为奇数行