42747人阅读
linux(43)
Table of Contents
1. Sed简介
3. Sed命令
5. 元字符集
1. Sed简介
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为&模式空间&(pattern
space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有
改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
3. Sed命令
调用sed命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
在当前行后面加入一行文本。
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
用新的文本改变本行的文本。
从模板块(Pattern space)位置删除行。
删除模板块的第一行。
在当前行上面插入文本。
拷贝模板块的内容到内存中的缓冲区。
追加模板块的内容到内存中的缓冲区
获得内存缓冲区的内容,并替代当前模板块中的文本。
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
列表不能打印字符的清单。
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
打印模板块的行。
打印模板块的第一行。
从file中读行。
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
写并追加模板块到file末尾。
写并追加模板块的第一行到file末尾。
表示后面的命令对所有没有被选定的行发生作用。
s/re/string
用string替换正则表达式re。
打印当前行号码。
把注释扩展到下一个换行符以前。
以下的是替换标记
g表示行内全面替换。
p表示打印行。
w表示把行写入一个文件。
x表示互换模板块中的文本和缓冲区中的文本。
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
-e command, --expression=command
允许多台编辑。
-h, --help
打印帮助,并显示bug列表的地址。
-n, --quiet, --silent
取消默认输出。
-f, --filer=script-file
引导sed脚本文件名。
-V, --version
打印版本和版权信息。
5. 元字符集
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
保存匹配的字符,如s//(love/)able//1rs,loveable被替换成lovers。
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
锚定单词的开始,如://
锚定单词的结束,如/love/&/匹配包含以love结尾的单词的行。
重复字符x,m次,如:/0/{5/}/匹配包含5个o的行。
重复字符x,至少m次,如:/o/{5,/}/匹配至少有5个o的行。
重复字符x,至少m次,不多于n次,如:/o/{5,10/}/匹配5--10个o的行。
删除:d命令
$ sed '2d' example-----删除example文件的第二行。
$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
$ sed '$d' example-----删除example文件的最后一行。
$ sed '/test/'d example-----删除example文件所有包含test的行。
替换:s命令
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
$ sed 's/^192.168.0.1/&localhost/'
example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加
localhost,变成192.168.0.1localhost。
$ sed -n 's//(love/)able//1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,&在这里是分隔符,代替了默认的&/&分隔符。表示把所有10替换成100。
选定行的范围:逗号
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
多点编辑:e命令
$ sed -e '1,5d' -e 's/test/check/'
example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执
行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
从文件读入:r命令
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
追加命令:a命令
$ sed '/^test/a//---&this is a example' example&-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
插入:i命令
$ sed '/test/i//
-------------------------' example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
下一个:n命令
$ sed '/test/{ s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
变形:y命令
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
退出:q命令
$ sed '10q' example-----打印完第10行后,退出sed。
保持和获取:h命令和G命令
$ sed -e '/test/h' -e '$G
example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将
打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保
持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中
的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
比如,如果要打印出含有字串&1024&的行,我就可能会用:
cat filename | sed &n &/1024/p&sed命令详解!!(要学习shell的 朋友要好好看看)
sed /^$/d filename
可以删除文件中的空行。
sed /^[[:space:]]*$/d filename
可以删除内容为多个空格/tab组成的行。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:127158次
积分:1353
积分:1353
排名:千里之外
原创:14篇
转载:96篇
(2)(1)(3)(6)(3)(1)(7)(8)(1)(8)(69)(1)sed:Stream Editor文本流编辑,sed是一个&非交互式的&面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。
sed命令的语法格式:
sed的命令格式: sed [option] 'sed command'filename
sed的脚本格式:sed [option] -f 'sed script'filename
sed命令的选项(option):
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用&f filename 执行filename内的sed动作
-r :支持扩展表达式
-i :直接修改文件内容
sed在文件中查询文本的方式:
1)使用行号,可以是一个简单数字,或是一个行号范围
表示行号从x到y
查询包含模式的行
/pattern /pattern
查询包含两个模式的行
pattern/,x
在给定行号上查询包含模式的行
x,/pattern/
通过行号和模式查询匹配的行
查询不包含指定行号x和y的行
2)使用正则表达式、扩展正则表达式(必须结合-r选项)
锚点行首的符合条件的内容,用法格式"^pattern"
锚点行首的符合条件的内容,用法格式"pattern$"
匹配任意单个字符
匹配紧挨在前面的字符任意次(0,1,多次)
匹配任意长度的任意字符
匹配紧挨在前面的字符0次或1次
匹配其前面的字符至少m次,至多n次
匹配其前面的字符至少m次
精确匹配前面的m次\{0,n\}:0到n次
锚点词首----相当于 \b,用法格式:\&pattern
锚点词尾,用法格式:\&pattern
\&pattern\&
分组,用法格式:pattern,引用\1,\2
匹配指定范围内的任意单个字符
匹配指定范围外的任意单个字符
所有数字, 相当于0-9, [0-9]---& [[:digit:]]
所有的小写字母
所有的大写字母
所有的字母
相当于0-9a-zA-Z
所有标点符号
#######sed的匹配模式支持正则表达式#####################&&
sed'5&q'/etc/passwd#打印前5行&&
sed-n&'/r*t/p'/etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行&&
sed-n&'/.r.*/p'/etc/passwd#打印匹配有r的行并且r后面跟任意字符&&
sed-n&'/o*/p'/etc/passwd#打印o字符重复任意次&&
sed-n&'/o\{1,\}/p'/etc/passwd#打印o字重复出现一次以上&&
sed-n&'/o\{1,3\}/p'/etc/passwd#打印o字重复出现一次到三次之间以上&&
sed的编辑命令(sed command):
打印匹配行(和-n选项一起合用)
显示文件行号
在定位行号后附加新文本信息
在定位行号后插入新文本信息
删除定位行
用新文本替换定位文本
w filename
写文本到一个文件,类似输出重定向 &
r filename
从另一个文件中读文本,类似输入重定向 &
使用替换模式替换相应模式
第一个模式匹配完成后退出或立即退出
显示与八进制ACSII代码等价的控制符
在定位行执行的命令组,用分号隔开
从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理
在数据流中添加下一行以创建用于处理的多行组
将模式2粘贴到/pattern n/
传送字符,替换单个字符
对文件的操作无非就是&增删改查&,怎样用sed命令实现对文件的&增删改查&,玩转sed是写自动化脚本必须的基础之一。
sed命令打印文件信息(查询):
####用sed打印文件的信息的例子的命令######&&
sed&-n&'/^#/!p'&&/etc/vsftpd/vsftpd.conf&&&&&&&&&
sed&-n&'/^#/!{/^$/!p}'&&/etc/vsftpd/vsftpd.conf&&
sed&-e&'/^#/d'&-e&'/^$/d'&&/etc/vsftpd/vsftpd.conf&&
sed&-n&'1,/adm/p'&/etc/passwd&&
sed&-n&'/adm/,6p'&/etc/passwd&&
sed&-n&'/adm/,4p'&/etc/passwd&&
sed&-n&'/adm/,2p'&/etc/passwd&&
###以下图片是对这些sed命令例子的解释和显示结果&&
sed命令实现对文件内容的添加:(对源文件添加的话就用-i参数):
####sed命令可以实现的添加######&&
#1)匹配行的行首添加,添加在同行&&
#2)匹配行的行中的某个字符后添加&&
#3)匹配行的行尾添加字符&&
#4)匹配行的行前面行添加&&
#5)匹配行的行后面行添加&&
#6)文件的行首添加一行&&
&&[root@jie1&~]#&sed&-i&'1&i\sed&command&start'&myfile&&
#7)文件的行尾追加一行&&
&&[root@jie1&~]#&sed&-i&'$a&\sed&command&end'&myfile&&
sed命令实现对文件内容的删除:(对源文件直接删除用-i参数):
sed的删除操作是针对文件的行,如果想删除行中的某个字符,那就用替换(别急,替换稍后就讲,而且替换是sed最常用的)
&重点:sed命令实现对文件内容的替换(替换是在shell自动化脚本中用到最多的操作)
#================源文件里面的内容===============================&&
[root@jie1&~]#&cat&test&&
anonymous_enable=YES&&
write_enable=YES&&
local_umask=022&&
xferlog_enable=YES&&
connect_from_port_20=YES&&
root:x:0:0:root:/root:/bin/bash&&
bin:x:1:1:bin:/bin:/sbin/nologin&&
daemon:x:2:2:daemon:/sbin:/sbin/nologin&&
adm:x:3:4:adm:/var/adm:/sbin/nologin&&
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin&&
DEVICE="eth0"&&
BOOTPROTO="static"&&
HWADDR="00:0C:29:90:79:78"&&
ONBOOT="yes"&&
IPADDR=172.16.22.1&&
NETMASK=255.255.0.0&&
#======================================================================&&
[root@jie1&~]#&sed&-i&'/DEVICE/c\Ethernet'&test&&&
&&&&&&&匹配DEVICE的行,替换成Ethernet这行&&
[root@jie1&~]#&sed&-i&'s/static/dhcp/'&test&&&&&&&
&&&&&&&把static替换成dhcp(/,@,#都是前面所说的地址定界符)&&
[root@jie1&~]#&sed&-i&'/IPADDR/s@22\.1@10.12@'&test&&
&&&&&&&匹配IPADDR的行,把22.1替换成10.12由于.号有特殊意义所有需要转义&&
[root@jie1&~]#&sed&-i&'/connect/s#YES#NO#'&test&&&
&&&&&&&匹配connect的行,把YES替换成NO&&
[root@jie1&~]#&sed&-i&'s/bin/tom/2g'&test&&&&&&&&&
&&&&&&&把所有匹配到bin的行中第二次及第二次之后出现bin替换成tom&&
[root@jie1&~]#&sed&-i&'s/daemon/jerry/2p'&test&&&&
&&&&&&&把所有匹配到bin的行中第二次出现的daemon替换成jerry,并在生产与匹配行同样的行&&
[root@jie1&~]#&sed&-i&'s/adm/boss/2'&test&&&&&&&&&
&&&&&&&把所有匹配到adm的行中仅仅只是第二次出现的adm替换成boss&&
[root@jie1&~]#&sed&-i&'/root/{s/bash/nologin/;s/0/1/g}'&test&&
&&&&&&&匹配root的行,把bash替换成nologin,且把0替换成1&&
[root@jie1&~]#&sed&-i&'s/root/(&)/g'&test&&&&&&&&&&&&&&&&&&&
&&&&&&&把root用括号括起来,&表示引用前面匹配的字符&&
[root@jie1&~]#&sed&-i&'s/BOOTPROTO/#BOOTPROTO/'&test&&&&&&&&
&&&&&&&匹配BOOTPROTO替换成#BOOTPROTO,在配置文件中一般用于注释某行&&
[root@jie1&~]#&sed&-i&'s/ONBOOT/#&/'&test&&&&&&&&&&&&&&&&&&&
&&&&&&&匹配ONBOOT的行的前面添加#号,在配置文件中也表示注释某行&&
[root@jie1&~]#&sed&-i&'/ONBOOT/s/#//'&test&&&&&&&&&&&&&&&&&&
&&&&&&&匹配ONBOOT的行,把#替换成空,即去掉#号,也一般用作去掉#注释&&
#================执行以上sed命令之后文件显示的内容====================&&
[root@jie1&~]#&cat&test&&
anonymous_enable=YES&&
write_enable=YES&&
local_umask=022&&
xferlog_enable=YES&&
connect_from_port_20=NO&&
(root):x:1:1:(root):/(root):/bin/nologin&&
bin:x:1:1:tom:/tom:/stom/nologin&&
daemon:x:2:2:jerry:/sbin:/stom/nologin&&
daemon:x:2:2:jerry:/sbin:/stom/nologin&&
adm:x:3:4:boss:/var/adm:/sbin/nologin&&
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin&&
Ethernet&&
#BOOTPROTO="dhcp"&&
HWADDR="00:0C:29:90:79:78"&&
ONBOOT="yes"&&
IPADDR=172.16.10.12&&
NETMASK=255.255.0.0&&
sed引用变量:(在自动化shell脚本 中也经常会使用到变量)
第一种当sed命令里面没有默认的变量时可以把单引号改成双引号;
第二种当sed命令里面有默认的变量时,那自己定义的变量需要加单引号,且sed里面的语句必须用单引
[root@jie1&~]#&cat&&&&myfile&&&&EOF&&
&&hello&world&&
&&i&am&jie&&
&&how&are&you&&
&&EOF&&先生成一个文件&&
[root@jie1&~]#&cat&myfile&&
hello&world&&
i&am&jie&&
how&are&you&&
[root@jie1&~]#&name=li&&
&&&&&&&&定义一个变量,且给变量赋值&&
[root@jie1&~]#&sed&-i&"s/jie/$name/"&myfile&&
&&&&&&&&把匹配jie的字符替换成变量的值&&
[root@jie1&~]#&cat&myfile&&
hello&world&&
how&are&you&&
[root@jie1&~]#&sed&-i&"$a&$name"&myfile&&
&&&&&&&&&当sed命令也有默认变量时,在去引用自己定义的变量会出现语法错误&&
sed:&-e&expression,&char&3:&extra&characters&after&command&&
[root@jie1&~]#&sed&-i&'$a&'$name''&myfile&&
&&&&&&&&&在引用自定义的变量时,sed语句必须用单引引住,然后把自定义的变量也用单引号引住&&
[root@jie1&~]#&cat&myfile&&
hello&world&&
how&are&you&&
[root@jie1&~]#&&
sed的其它高级使用:
1)把正在用sed操作的文件的内容写到例外一个文件中
[root@jie1&~]#&cat&test&&sed操作的文件中的内容&&
Ethernet&&
#BOOTPROTO="dhcp"&&
HWADDR="00:0C:29:90:79:78"&&
ONBOOT="yes"&&
IPADDR=172.16.10.12&&
NETMASK=255.255.0.0&&
[root@jie1&~]#&sed&-i&'s/IPADDR/ip/w&ip.txt'&test&&
&&&&&&把sed操作的文件内容保存到另外一个文件中,w表示保存,ip.txt文件名&&
[root@jie1&~]#&cat&ip.txt&查看新文件的内容&&
ip=172.16.10.12&&
[root@jie1&~]#&&
2)读取一个文件到正在用sed操作的文件中
[root@jie1&~]#&cat&myfile&&文件内容&&
hello&world&&
how&are&you&&
[root@jie1&~]#&cat&test&将用sed操作的文件的内容&&
Ethernet&&
#BOOTPROTO="dhcp"&&
HWADDR="00:0C:29:90:79:78"&&
ONBOOT="yes"&&
IPADDR=172.16.10.12&&
NETMASK=255.255.0.0&&
[root@jie1&~]#&sed&&-i&'/Ethernet/r&myfile'&test&&
&&&&&在匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后&&
[root@jie1&~]#&cat&test&再次查看用sed命令操作的行&&
Ethernet&&
hello&world&&
how&are&you&&
#BOOTPROTO="dhcp"&&
HWADDR="00:0C:29:90:79:78"&&
ONBOOT="yes"&&
IPADDR=172.16.10.12&&
NETMASK=255.255.0.0&&
[root@jie1&~]#&&
sed的经典例子:
##1)、处理以下文件内容,将域名取出并进行计数排序,如处理:&&
得到如下结果:&&
域名的出现的次数&域名&&
[root@localhost&shell]#&cat&file&|&sed&-e&'&s/http:\/\///'&-e&'&s/\/.*//'&|&sort&|&uniq&-c&|&sort&-rn&&
[root@codfei4&shell]#&awk&-F/&'{print&$3}'&file&|sort&-r|uniq&-c|awk&'{print&$1"\t",$2}'&&
##2)、用grep结合sed取出网卡的ip地址&&
[root@jie1&~]#&ifconfig&|&grep&-B1&"inet&addr"&|grep&-v&"\-\-"&|sed&-n&-e&'N;s/eth[0&9].*\n.*addr:[0&9]{1,3}\.[0&9]{1,3}\.[0&9]{1,3}\.[0&9]{1,3}.*/\1&\2/p'&&
学会sed的使用是写自动化shell脚本的基础,sed也是一个非常有用且重要的命令,是文本处理工具之一,以上是我自己学习总结的sed命令简单的用法,sed还有更高级的用法,也还在学习中。
阅读(...) 评论()linux sed命令参数及用法详解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
linux sed命令参数及用法详解
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩13页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢5570人阅读
Linux 相关(22)
1. Sed简介
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
2. 定址
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。
3. Sed命令
调用sed命令有两种形式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
在当前行后面加入一行文本。
b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
用新的文本改变本行的文本。
从模板块(Pattern space)位置删除行。
删除模板块的第一行。
在当前行上面插入文本。
拷贝模板块的内容到内存中的缓冲区。
追加模板块的内容到内存中的缓冲区
获得内存缓冲区的内容,并替代当前模板块中的文本。
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
列表不能打印字符的清单。
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
打印模板块的行。
P(大写)
打印模板块的第一行。
退出Sed。
r file
从file中读行。
t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file
写并追加模板块到file末尾。
W file
写并追加模板块的第一行到file末尾。
表示后面的命令对所有没有被选定的行发生作用。
s/re/string
用string替换正则表达式re。
打印当前行号码。
把注释扩展到下一个换行符以前。
以下的是替换标记
g表示行内全面替换。
p表示打印行。
w表示把行写入一个文件。
x表示互换模板块中的文本和缓冲区中的文本。
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
4. 选项
-e command, --expression=command
允许多台编辑。
-h, --help
打印帮助,并显示bug列表的地址。
-n, --quiet, --silent
取消默认输出。
-f, --filer=script-file
引导sed脚本文件名。
-V, --version
打印版本和版权信息。
5. 元字符集^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
锚定单词的开始,如:/\&love/匹配包含以love开头的单词的行。
锚定单词的结束,如/love\&/匹配包含以love结尾的单词的行。
x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。
6. 实例
删除:d命令
$ sed '2d' example-----删除example文件的第二行。
$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。
$ sed '$d' example-----删除example文件的最后一行。
$ sed '/test/'d example-----删除example文件所有包含test的行。
替换:s命令
$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。
$ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
选定行的范围:逗号
$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。
$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
多点编辑:e命令
$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
从文件读入:r命令
$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令
$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。
追加命令:a命令
$ sed '/^test/a\\---&this is a example' example&-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
插入:i命令
$ sed '/test/i\\
new line
-------------------------' example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
下一个:n命令
$ sed '/test/{ s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
变形:y命令
$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
退出:q命令
$ sed '10q' example-----打印完第10行后,退出sed。
保持和获取:h命令和G命令
$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令
$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
7. 脚本
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行
本篇文章来源于 黑基网-中国最大的网络安全站点 原文链接:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:325512次
积分:1795
积分:1795
排名:第15952名
原创:13篇
转载:70篇
评论:29条
(1)(2)(1)(11)(2)(5)(5)(5)(4)(10)(2)(8)(3)(2)(6)(16)