三剑客命令之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:打印模式空间开端至 内容,并追加到默认输出之前

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为奇数行

原文地址:https://www.cnblogs.com/centos-Paul/p/9382856.html