Shell编程之---sed命令详解


sed 是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑
sed只是对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件

sed命令调用的三种方式
1、在shell命令行输出命令调用sed

sed [option] 'sed cmd' file

2、将sed命令插入脚本
sed [option] -f 'sed.sh' file
#vi sed.sh sed要调用的脚本为sed.sh
#/file:/a\This is a test line!!!
调用脚本
#sed -f sed.sh test

3、将sed命令插入脚本,直接执行
./sed.sh file
#vi sed.sh sed脚本
#!/bin/sed -f
#/file:/a\This is a test line!!!
#./sed.sh test 执行脚本


sed命令选项及意义
-n #不打印所有行到标准输出
-e #表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,-e选项可以省略
-f #调用sed脚本文件

sed命令定位文本的方法

x #x为指定行号
x,y #指定从x到y的行号范围
/pattern/ #查询包含模式的行
/pattern/pattern/ #查询包含两个模式的行
/pattern/,x #从与pattern的匹配行到x号行之间的行
x,/pattern/ #从x号行到与pattern的匹配行之间的行
x,y! #查询不包括x和y行号的行

sed编辑命令
p #打印匹配行
= #打印文件行号
a\ #在定位行号之后追加文本信息
i\ #在定位行号之前插入文本信息
d #删除定位行
c\ #用新文本替换定位文本
s #使用替换模式替换相应模式
r #从另一个文件中读文本
w #将文本写入到一个文件
y #变换字符
q #第一个模式匹配完成后退出
l #显示与八进制ASCII码等价的控制字符
{} #在定位行执行的命令组
n #读取下一个输入行,用下一个命令处理新的行
h #将模式缓冲区的文本复制到保持缓冲区
H #将模式缓冲区的文本追加到保持缓冲区
x #互换模式缓冲区和保持缓冲区的内容
g #将保持缓冲区的内容复制到模式缓冲区
G #将保持缓冲区的内容追加到模式缓冲区

======================================================================================

sed示例

打印第一行
#sed -n '1p' test

打印全部内容,并且有两个第一行
#sed '1p' test

打印文本中的3-6行
#sed -n '3,6p' test

模式匹配,打印出包含certificate所在的行
#sed -n '/certificate/p' test

sed [-e]:表示将下一个字符串解析为sed编辑命令
(1)、打印certificate匹配模式的内容
(2)、打印certificate匹配模式的行号
(3)、打印certificate匹配模式的内容及行号
#sed -n '/certificate/p' test
#sed -n '/certificate/=' test
#sed -n -e '/certificate/p' -e '/certificate/=' test

带多个编辑命令sed的一般格式为
#sed [option] -e cmd1 -e cmd2 -e cmdn inputfile

在文本字符串file:后面追加内容为:This is a test file!!!
#sed '/file:/a\This is a test file !!!' test

将wanglei用户直接追加到/etc/passwd文本的root下面
#sed -i '/root:x:0:0/a\wanglei:x:0:0:wanglei:/wanglei:/bin/bash' /etc/passwd

打印出文本test中包含.字符的行
#sed -n '/\./p' test

打印出文本test中包含$字符的行
#sed -n '/\$/p' test

打印出文本test中的最后一行
#sed -n '$p' test

打印出以bus结尾字符串的行
#sed -n '/.*bus$/p' test

打印出不在2-10之间的行
#sed -n '2,10!p' test

打印出除了字符串certificate以外的所有行
#sed -n '/certificate/!p' test

在文本test中above字符串前面的行插入内容"This is a test line!!!",并保存于文件之中
#sed -i '/above/i\@This is a test line!!!' test

打印在文本test中above字符串到13行之间的内容
#sed -n '/above/,13p' test

打印在文本test中3行到字符串/home/globus/.的行
#sed -n '3,/\/home\/globus\/\./p' test

在test文本$88字符串前面插入一行"This is a test \i line!!!"
#sed '/\$88/i\This is a test \\i line!!!' test
把文中匹配的字符串的文本行用新文本替代\c
#sed '/指定地址/c\test' file

将文本中匹配above字符串的行替换为新行"This is a new line!!!"
#sed '/above/c\This is a new line!!!' test

将文本中1,5,13行替换为"This is a 1 line !!!"(1,5,13)
#sed -e '1c\This is a 1 line!!!' -e '5c\This is a 5 line!!!' -e '13c\This is a 13 line!!!' test

删除test文本中的第3行
#sed '3d' test

删除test文本中的1-3行
#sed '1,3d' test

删除test文本中字符串above到13行的内容
#sed '/above/,13d' test

删除最后一行文本
#sed '$d' test

删除5行到最后一行
#sed '5,$d' test

删除文本中不区分大小写的字符串certificate的行
#sed '/[Cc][Ee][Rr][Tt][Ii][Ff][Ii][Cc][Aa][Tt][Ee]/d' test


替换文本 #替换一个或多个字符串
s/被替换的字符串/新字符串/[替换选项]
g #表示替换文本中所有出现被替换字符串之处
p #与-n选项结合,只打印替换行
w 文件名 #表示将输出定向到一个文件

#sed -n 's/被替换的字符串/新字符串/p' 输入文件

将test文件中的字符串Certificate替换成CERTIFICATE(同行中有多个则只替换前面的一个)
#sed -n 's/certificate/CERTIFICATE/p' test

将test文件中所有的字符串above替换成shabi,并保存于/root/char文件中
#sed -n 's/above/shabi/pg w /root/char' test

替换test文本中的字符串,将above替换为char,替换文中每行第二个出现的char
#sed -n 's/above/char/2p' test

替换test文本中的字符串,将above替换为charset,替换文中每行第6个出现的above,并且保存到/root/save
#sed -n 's/above/charset/6p w /root/save' xx

替换test文中的字符串CERTIFICATE,替换为oye,并保存为oye
#sed -n 's/CERTIFICATE/oye/pg w oye' test

& 可以用来保存被替换的字符串以供调用,&符号等价于替换前字符串
#sed -n 's/seu/(&)/pg' test
#sed -n 's/seu/(seu)/pg' test

打印出test文件的1-5行,并写入到output
#sed -n '1,5 w output' test

将文件xx的内容读入文件test文件字符串above的后面
#sed '/above/r xx' test

将文件xx的内容读入文件test文件第5行后面
#sed '5r xx' test

将文件xx的内容读入文件test文件第5-7行后面
#sed '5,7r xx' test

将文件xx的内容读入文件test文件第5,7,12行后面
#sed -e '5r xx' -e '7r xx' -e '12r xx' test

打印出test文件中.r.*匹配的文件
#sed -n '/.r.*/p' test

打印出test文件中.r.*匹配的文件,并且只打印出匹配的第一个行
#sed '/.r.*/q' test

==========================================================
变换命令 y
表示字符变换,将一系列的字符变换为相应的字符,对字符逐个处理,1处理1 2处理2 …
#sed 'y/被变换的字符序列/变换的字符序列' 输入文件

将test文件中的所有a、b、c、d、e、f、g、h、i分别变换为数字1、2、3、4、5、6、7、8、9
#sed 'y/abcdefghi/123456789/' test

将test文件中的a、b、o、v、e、字符转换为A、B、O、V、E
#sed 'y/above/ABOVE/' test

将test文件中27个英文字母替换为1234567890-=`~!@#$%^&*()_+/
#sed 'y/abcdefghijklmnopqrstuvwxyz/1234567890-=`~!@#$%^&*()_+/' test

在定位行执行命令组{}
#sed -n '/Certificate/{p;=}' test
等价于:sed -n -e '/Certificate/p' -e '/Certificate/=' test

在test文本中与Certificate关键字匹配的行全部的i替换为I,将第一个le替换为99
#sed '/Certificate/{s/i/I/g;s/le/99/;}' test

n #处理匹配行的下一行

将test文本中字符串certificate下面一行的user字符替换为99
#sed '/certificate/{n;s/user/99/;}' test

将test文本中字符串certificate下面一行的\字符替换为gang
#sed '/certificate/{n;s/\\/gang/;}' test
=================================
sed缓冲区处理

#sed -e '/file1/h' -e '/file2/x' -e '$G' xxx
1、h #将匹配file1的行复制到保持缓冲区
2、x #将匹配file2的行和保持缓冲区的行互换(file1行)
3、G #将保持缓冲区的内容追加到模式缓冲区 $为最后一行

利用分号分隔多个编辑命令 -e {} ;
利用分号打印出test文件中字符串Ceritificate的行和行号
#sed -n '/Certificate/p;/Certificate/=' test

把xxx文件中匹配file1的字符替换为wl,匹配file2替换为fx,匹配file3替换为ywc,匹配file4替换为ly
#sed 's/file1/wl/; s/file2/fx/; s/file3/ywc/; s/file4/ly/;' xxx

以下是前面实例有用到的脚本

======================================================================
1---This is a read file1
2---This is a read file2
3---This is a read file3
4---This is a read file4
5---This is a read file5
6---This is a read file6
7---This is a read file7
======================================================================
1\This is a Certificate Request file:
2\
3\It should be meailed to zawu@seu.edu.cn
4\
5\===========================================================
6\Certificate Subject:
7\
8\ /O=Grid/OU=GlobusTest/OU=simpleCA-seugridl.seu.edu.cn/OU=seu.edu.cn/CN=globus
9\
10\the above string is known as your user certificate subject , and it uniquely identifies
11\this user . $88
12\To install this user certificate, please save this e-mail message into the following file.
13\
14\/home/globus/.globus/usercert.pem
15\fawnbusgfqa
16\fwafawfbus

相关内容