您的位置:首页 > 运维架构 > Shell

第七章 Shell文本处理三剑客之sed

2017-01-20 23:57 585 查看
 sed

流编辑器,过滤和替换文本。

工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并清空模式空间。然后再将下一行读入模式空间进行处理输出,以此类推,直到最后一行。还有一个空间叫保持空间,又称暂存空间,可以暂时存放一些处理的数据,但不能直接输出,只能放到模式空间输出。

这两个空间其实就是在内存中初始化的一个内存区域,存放正在处理的数据和临时存放的数据。

Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed [选项] '地址 命令' file

选项

描述

-n不打印模式空间
-e执行脚本、表达式来处理
-f脚本文件的内容添加到命令被执行
-i修改原文件
-r使用扩展正则表达式
命令

描述

s/regexp/replacement/替换字符串
p打印当前模式空间
P打印模式空间的第一行
d删除模式空间,开始下一个循环
D删除模式空间的第一行,开始下一个循环
=打印当前行号
a \text当前行追加文本
i \text当前行上面插入文本
c \text所选行替换新文本
q立即退出sed脚本
r追加文本来自文件
: labellabel为b和t命令
b label分支到脚本中带有标签的位置,如果分支不存在则分支到脚本的末尾
t label如果s///是一个成功的替换,才跳转到标签
h H复制/追加模式空间到保持空间
g G复制/追加保持空间到模式空间
x交换模式空间和保持空间内容
l列出当前行在
n N读取/追加下一行输入到模式空间
w filename写入当前模式空间到文件
!取反、否定
&引用已匹配字符串
地址

描述

first~step步长,每step行,从第first开始
$匹配最后一行
/regexp/正则表达式匹配行
number只匹配指定行
addr1,addr2开始匹配addr1行开始,直接addr2行结束
addr1,+N从addr1行开始,向后的N行
addr1,~N从addr1行开始,到N行结束
博客地址:

QQ群:323779636(Shell/Python运维开发群)
借助以下文本内容作为示例讲解:

# tail /etc/services |sed -n '1p'     
nimgtw          48003/udp               # Nimbus Gateway

# seq 10 |sed -n '1~2p'
1
3
5
7
9[/code]
# tail /etc/services |sed -n '$p' 
iqobject        48619/udp               # iqobject[/code]
# tail /etc/services  |sed -n '/^blp5/,/^com/p'
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw[/code]
# a=1
# tail /etc/services |sed -n ''$a',3p'

# tail /etc/services |sed -n "$a,3p"[/code]
# sed '/^#/d;/^$/d' /etc/httpd/conf/[/code]
# tail /etc/services |sed -n 's/^blp5/test/p'
test            48129/tcp               # Bloomberg locator
test            48129/udp               # Bloomberg locator[/code]
# tail /etc/services | sed '1,4s/blp5/test/'                   
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
test            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker[/code]
# tail /etc/services  |sed 's/blp5/test/;s/3g/4g/'
4gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
test            48129/tcp               # Bloomberg locator
test            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker[/code]
# tail /etc/services |sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/'
3gpp-cbsp       tcp/48049               # 3GPP Cell Broadcast Service Protocol
isnetserv       tcp/48128               # Image Systems Network Services
isnetserv       udp/48128               # Image Systems Network Services
blp5            tcp/48129               # Bloomberg locator
blp5            udp/48129               # Bloomberg locator
com-bardac-dw   tcp/48556               # com-bardac-dw
com-bardac-dw   udp/48556               # com-bardac-dw
iqobject        tcp/48619               # iqobject
iqobject        udp/48619               # iqobject
matahari        tcp/49000               # Matahari Broker[/code]
# seq 10 |sed '/5/,+3s/^/#/'
1
2
3
4
#5
#6
#7
#8
9
10[/code]
# tail /etc/services |sed -e '1,2d' -e 's/blp5/test/'
isnetserv       48128/udp               # Image Systems Network Services
test            48129/tcp               # Bloomberg locator
test            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker
也可以使用分号分隔:
# tail /etc/services |sed '1,2d;s/blp5/test/'[/code]
[b]# tail /etc/services |sed '/blp5/a \test'
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
test
blp5            48129/udp               # Bloomberg locator
test
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker[/code]
# tail /etc/services |sed '2a \test'     
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
test
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker[/code]
# cat 
123
456
# tail /etc/services |sed '/blp5/r '         
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
123
456
blp5            48129/udp               # Bloomberg locator
123
456
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
matahari        49000/tcp               # Matahari Broker[/code]
# seq 5 |sed -n '/3/{n;p}'                             
4[/code]
# seq 6 |sed 'n;d'    
1
3
5[/code]
# seq 6 |sed 'n;n;s/^/=/;s/$/=/'
1
2
=3=
4
5
=6=[/code]
# seq 6 |sed 'N;q'
1
2
将两行合并一行:
# seq 6 |sed 'N;s/\n//'
12
34
56[/code]
# seq 5 |sed -n '$!N;p'           
1
2
3
4
5[/code]
# seq 6 |sed 'N;D'       
6[/code]
# seq 6 |sed -e '/3/{h;d}' -e '$G'
1
2
4
5
6
3[/code]
# seq 5 |sed '1!G;h;$!d'
5
4
3
2
1[/code]
# seq 6 |sed 'N;s/\n/,/'
1,2
3,4
5,6[/code]
# seq 6 |sed ':a;N;$!b a;s/\n/,/g'
1,2,3,4,5,6[/code]
# echo "123456789" |sed -r 's/([0-9]+)([0-9]+{3})/\1,\2/'
123456,789
# echo "123456789" |sed -r ':a;s/([0-9]+)([0-9]+{3})/\1,\2/;t a'
123,456,789
# echo "123456789" |sed -r ':a;s/([0-9]+)([0-9]+{2})/\1,\2/;t a'
1,23,45,67,89[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: