SED元芳是什么意思思

您所在的位置: &
sed的用法(1)
sed的用法(1)
电子工业出版社
《实战Linux Shell编程与服务器管理》第13章sed和awk入门,本章将介绍这两个强大工具的基本用法,熟悉这两者,可让你的Script如虎添翼,威力大增。本节为大家介绍sed的用法。
13.2& sed的用法(1)
sed是一种非交互式的流编辑器,可动态编辑文件。所谓非交互式是说,sed和传统的文本编辑器不同,并非和使用者直接互动,sed处理的对象是文件的数据流(称为stream/流)。sed的工作模式是,比对每一数据行,若符合样式,就执行指定的操作。
本节介绍的sed是指GNU版的sed。执行sed --version可查看版本信息。
sed的语法如下:sed&'样式命令'&文件&
它的意思是说:如果文件中某一行符合"样式",就执行指定的sed命令,如删除(d)或取代(s)。
这里的"样式"使用一对//含括,表示寻找之意;也可以指定数据行的范围,例如:1,6表示作用范围是由第1行到第6行;/AAA/,/DDD/表示作用范围是从含有 AAA的数据行,到含有DDD的数据行。
请特别注意:sed并不会更改文件内容。sed的工作方式是读取文件内容,经流编辑之后,把结果显示到标准输出。因此,如果想要存储sed的处理结果,得自行运用转向输出将结果存成其他文件。
以下介绍sed的各种用法:
sed的用法1:删除某一段范围的数据行。sed&'1,4d'&dataf1&
用途 把第1到第4行数据删除,剩下的显示出来。d是sed的删除命令。
sed的用法2:把含有"样式"的数据行删除。sed&'/La/d'&dataf3&
用途 把含有La的行删除,剩下的显示出来。其中,/ / 代表搜索之意。sed&'/[0-9]\{3\}/d'&dataf3&
用途 把含有"3位数"的行删除,剩下的显示出来。
在样式[0-9]\{3\}中,\{3\} 表/ /要寻找的是3个数字组成的字符串。sed&'/^$/d'&dataf5&
删除dataf5的空白行。^ 表开头,$ 表尾部,这两者之间没有任何字符,代表该行是一空白行。
sed的用法3:把不含有"样式"的数据行删除。sed&'/La/!d'&dataf3&
用途 把不含有La的行删除,剩下的显示出来。
这里的!是否定的意思,表示不符合样式者。
sed的用法4:把含有"样式"的数据行显示出来。sed&'/La/p'&dataf3&
用途 把含有La的行显示出来。其中,p是sed的命令,它会把目前的数据显示出来,但因为sed默认也会显示不符合的数据行,所以,应改用以下指令:sed&-n&'/La/p'&dataf3&
选项-n会抑制sed显示出其他资料行的默认操作,只显示符合样式的数据行。
sed的用法5:取代。sed&-n&'s/La/Oo/p'&dataf3&
这里的s是取代的意思,第一对//中含括的字符串(La)是搜索的目标,第二对//含括的是置换的字符串(Oo)。它会把数据行中的字符串La换成Oo。
请注意:上面这个指令,只会更换第一个出现的La而已,如要全部置换,应再加上全局的命令g,如下所示:sed&-n&'s/La/Oo/gp'&dataf3&
这样就会把所有找到的La全换成Oo了。
取代的用法,还有以下几个:
用例1sed&-n&'s/La//p'&dataf3&
把每一行第一个出现的La删除(把La置换成空字符串,就是删除)。
用例2sed&'s/^...//'&dataf3&
【责任编辑: TEL:(010)】&&&&&&
关于&&&&&&的更多文章
Linux命令行吸引了大多数Linux爱好者。一个正常的Linux用户一般
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
本书全面讲解WPF的实际工作原理,是一本WPF权威著作。
SQL Server 2012附带了强大的Analysis Services新功能
本书通过对目前中国企业在风险管理和内部控制工作中的
本书由Symantec首席反病毒研究员执笔,是讲述现代病毒威胁、防御技术和分析工具的权威指南。与多数讲述计算机病毒的书籍不同,
51CTO旗下网站表面传导电子发射(SED)是另一种正待推出的新型电视机。但与其他类型不同,它同时兼具CRT的高清画质和平面的超薄设计。SED电视机可以支持超大屏幕和大尺寸图像,而厚度只有几。
SED电视机 -
SED电视机的是几百万个微型,称为(SCE)。单个非常微小,由一个构成,碳层中心有一道间隙。一半碳层与负电极相连,另一半与正电极相连。当电路提供电压约为10伏的电流给SCE时,电子就会出现在该间隙一侧。
SED电视机所包含的这几百万个SCE以矩阵的形式排列,并且每一个SCE控制图像中一个像素的红色、绿色或蓝色信号。该矩阵不是逐行激发,而是几乎同时激活所有需要的SCE来成像。
与CRT电视机一样,SED电视机内部也是真空的。所有的SCE位于真空的一侧,而在另一侧。荧光屏上带有,因此它会吸引SCE发出的电子。
电子到达时会穿过超薄的。这些电子会激发荧光物质,使其发出红色、绿色或蓝色的光。您的眼睛和大脑会结合这些发光点来形成。
屏幕上任何没有用于产生像素的部分均为,这可以提高图像的。在荧光粉和玻璃之间还有一个色彩,用来提高颜色精确度,并减少光的反射。
为了将所有信号联系在一起,当SED电视机收到信号后,它会进行如下处理:
。 确定如何处理每个像素的红色、绿色和蓝色信号。 激活需要的SCE,这些SCE可生成电子。然后,电子穿过真空到达屏幕。 当电子击中荧光粉时,那些像素点会发光,然后大脑将这些光结合在一起形成连贯的图像。图像以一定的速率变换,以使您观看到动态的画面。 此过程几乎是在瞬间发生的,电视机可以在每秒钟内成像60次。与CRT不同,SED电视机不必隔行图像,而是每隔一行就给图像着色一次。它可以一次整体成像。
SED电视机 -
SED电视机本应在2006年投放市场,并且当人们看到它在CES和其他电子产品方面的表现后,评价其画质优秀。SED电视机具有CRT电视机的全部最佳性能,如清晰、逼真、黑度高,且比CRT小、轻。SED电视机宽,并且采用了SCE结构,可以去除某些CR电视边角周围可能会产生的模糊图像。SED电视机结构紧凑、重量轻,并且比其他平板电视耗电低。 大多数人在实际购买SED电视机之前想要弄清楚SED电视机的缺点有点困难。但许多人猜测,SED电视机将来的售价一定非常高昂,大部分人会难以承受。据传闻,55英寸的SED电视机的售价大约为10,000美元。最近,日本东芝公司和日本佳能公司宣布SED电视机投放市场的日期(最初预定为2006年春季)已经推迟到2007年。这是为什么呢?其原因在于。
多年以来,每台电视机上的图像都来自于(CRT)。CRT可以生成色彩丰富的高品质图像,这就是目前许多电视机仍然采用CRT的原因。遗憾的是,CRT存在着体积大、重量重的缺点,并且不能支持今天人们想要的大屏幕。 市场上大部分新型电视机相比CRT在大小和重量方面都已经有所改善,但在成像方面仍然存在不足。视角狭窄、黑度不够、烙印和各种图像失真等缺点仍然困扰着新型电视机。
SED电视机基本上采用了相同的方法。从根本上来讲,平板电视使用几百万个CRT代替一个电子枪。这些微型被称为表面传导电子发射器(SCE)。在一台电视中,每个像素有三个SCE——分别对应红色、绿色和蓝色。一台宽屏、高清电视包含六百万个以上的SCE。
SED电视机 -
[1]网易[2]南方网[3]泡泡网[4]家庭娱乐系统
为本词条添加和相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和770多万专业认证智愿者沟通。
您也可以使用以下网站账号登录:
此词条还可添加&
编辑次数:5次
参与编辑人数:2位
最近更新时间: 11:40:26
贡献光荣榜
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品
扫描二维码用手机浏览词条
保存二维码可印刷到宣传品shell学习笔记5---sed详解(原创) - CzmMiao的博客生活 - ITeye技术网站
博客分类:
Sed简介sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。调用sed命令有两种形式:sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
选项-e command, --expression=command允许多台编辑$ 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表达式赋值。-h, --help打印帮助,并显示bug列表的地址。-n, --quiet, --silent不打印; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行-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的行。选定行的范围:逗号$ 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替换。
替换标记y表示把一个字符翻译为另外的字符(但是不用于正则表达式)该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把所有小写的a转换成A,小写的b转换成B,小写的c转换成C。$sed '1,20y/hrwang12/HRWANG^$/' datafile将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$。正则表达式元字符对y命令不起作用。与s命令的分隔符一样,斜线可以被替换成其它的字符。$ sed '1,10y/abcde/ABCDE/' example
#把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。q:退出Sed$ sed '10q' example
#打印完第10行后,退出sed。d:从模板块(Pattern space)位置删除行。
$ sed '2d' example
#删除example文件的第二行。$ sed '2,$d' example
#删除example文件的第二行到末尾所有行。$ sed '$d' example
#删除example文件的最后一行。$ sed '/test/'d example
#删除example文件所有包含test的行。r file:从file中读行。$ sed '/test/r file' example
#file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。s:用知道那个模式替换当前模式。s/re/string,用string替换正则表达式re。$ 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 '/a/=' mm 1abc$ sed -n '/a/=' mm 1引用shell变量在sed的命令行中引用shell变量时要使用双引号,而不是通常所用的单引号。下面是一个根据name变量的内容来删除named.conf文件中zone段的脚本:name='zone\ "localhost"'sed "/$name/,/};/d" named.conf
sed脚本Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。sed高级命令(G、H、g、h、n、N、x)由于各种各样的原因,比如用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保留以便下一次的处理,都有可能使得sed在处理文件的时候不按照正常的流程来进行。这个时候,sed设置了一些高级命令来满足用户的要求。+ g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除+ G:[address[,address]]G 将hold space中的内容append到pattern space\n后+ h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除+ H:[address[,address]]H 将pattern space中的内容append到hold space\n后+ d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中+ D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行pattern space相当于车间sed把流内容在这里处理。hold space相当于仓库,加工的半成品在这里临时储存。你可以将pattern space看成是一个流水线,所有的动作都是在“流水线”上执行的;而hold space是一个“仓库”,“流水线”上的东东都可以放到这里。
不论是使用G、g还是H、h,它们都是将hold space里面的内容“copy”到pattern space中或者将pattern space中的内容“copy”到hold space中。
英文解释如下The "h" command copies the pattern buffer into the hold buffer. The pattern buffer is unchanged.Instead of exchanging the hold space with the pattern space, you can copy the hold space to the pattern space with the "g" command. This deletes the pattern space. If you want to append to the pattern space, use the "G" command. This adds a new line to the pattern space, and copies the hold space after the new line.示例:用sed模拟出tac的功能(倒序输出)。文件内容$cat mm123解决方法:$sed ‘1!G;h;$!d’mm
1!G第1行不 执行“G”命令,从第2行开始执行。$!d,最后一行不删除(保留最后1行)图解分析过程
P:Pattern Space;H:Hold Space;蓝色:Hold Space中的数据;绿色:Pattern Space中的数据
x表示互换模板块中的文本和缓冲区中的文本。$ sed -e '/test/h' -e '/check/x' example
#互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
保持和获取:h命令和G命令$ sed -e '/test/h' -e '$G example
#在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
行转列的一个例子ls -1 | sed -ne "H;$ {x;s/\n/ /g;p}"H表示把pattern space 的内容追加到hold space中去,H可以带一个地址,这里用的是$,表示到文件的末尾,然后用x将之取到pattern space中,把\n替换成空格再打印即可。
n命令n命令简单来说就是提前读取下一行,覆盖模型空间前一行(并没有删除,因此依然打印至标准输出),如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后的任何命令,并对新读取的内容,重头执行。
打印偶数行$cat aaa This is 1
$sed -n 'n;p' aaa
//-n表示隐藏默认输出内容
This is 4注释:读取This is 1,执行n命令,此时模式空间为This is 2,执行p,打印模式空间内容This is 2,之后读取This is 3,执行n命令,此时模式空间为This is 4,执行p,打印模式空间内容This is 4,之后读取This is 5,执行n命令,因为没有了,所以退出,并放弃p命令。$ sed '/test/{ s/aa/bb/; }' example
#如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。N命令N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。sed并不对每行末尾\n进行处理,但是对N命令追加的行间\n进行处理,因为此时sed将两行看做一行。打印奇数行sed -n '$!N;P' aaa
!:表示后面的命令对所有没有被选定的行发生作用。
注释:读取1,$!条件满足(不是尾行),执行N命令,得出1\n2,执行P,打印得1,读取3,$!条件满足(不是尾行),执行N命令,得出3\n4,执行P,打印得3,读取5,$!条件不满足,跳过N,执行P,打印得5D命令D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,对剩余模式空间重新执行sed。从aaa文件中读取最后一行sed 'N;D' aaa
This is 5注释:读取1,执行N,得出1\n2,执行D,得出2,执行N,得出2\n3,执行D,得出3,依此类推,得出5,执行N,条件失败退出,因无-n参数,故输出5
参考至:/user1/21439/archives/.html
/aaa103439/item/dbaa6d0d27b4f812cc34eab8
/fhefh/archive//2259097.html
http://febest15./blog/static//
/FrankTan/archive//1692831.html
http://blog.csdn.net/jeffreyst/article/details/8775991
本文原创,转载请注明出处、作者
如有错误,欢迎指正邮箱:
浏览: 975356 次
来自: 厦门
写的挺好的,学到了。trackbacks-0
什么是sed?
sed 是在 UNIX ® 操作系统上运行的一个非交互式上下文编辑器。sed 被设计在下列三种情况下发挥作用:
1) 编辑那些对舒适的交互式编辑而言太大的文件。
2) 在编辑命令太复杂而难于在交互模式下键入的时候编辑任何大小的文件。
3) 要在对输入的一趟扫描中有效的进行多个‘全局’编辑函数。
因为每次只把输入的某些行驻留在内存中,并且不使用临时文件,所以可编辑的文件的有效大小,只受限于输入和输出要同时共存于次级存储的要求。
可以单独的建立复杂的编辑脚本并作为给 sed 的命令文件。对于复杂的编辑,这节省了可观的键入和随之而来的错误。从命令文件运行 sed 高效于作者所知道的任何交互式编辑器,甚至包括能用预先写好的脚本驱动的编辑器。
sed是如何操作的?
sed 缺省的把标准输入复制到标准输出,再把每行写到输出之前可能在其上进行一个或多个编辑命令。这种行为可以通过命令行上的标志来更改。
sed编辑命令的一般格式为:
[address]command [parameter]
一个或两个[address]是可以省略的;可以用任何数目的空白或 tab 把地址和函数分隔开。sed函数必须出现。依据给出的是哪个函数,参数可能是必需的或是可选的。忽略在这些行开始处的 tab 字符和空格。
sed如何对文件的行操作的步骤?
1)sed对[address]里匹配的行,执行命令并输出在stdout。
2)sed在对匹配的行的执行完所有命令后,自动跳到下一个匹配行重复命令执行。
3)sed对文本行的操作,并不会更改文本的行内容。sed是从文本中调出行内容,并备份,然后在这备份上执行sed命令,最终在stdout上输出操作后的行。
sed命令行格式和标志:
sed命令格式:sed
'sed-script'
在命令行上option:
* -n:告诉 sed 不复制所有的行,只复制 p 函数或在 s 函数后 p 标志所指定的行。
* -e:告诉 sed 把下一个参数接受为编辑命令。
* -f:告诉 sed 把下一个参数接受为文件名;这个文件应当包含一行一个的编辑命令。
什么是模式空间?
模式匹配的范围叫做模式空间。一般而言,模式空间是输入文本中某一行,但是可以通过使用 N 命令把多于一行读入模式空间
sed如何从输入文件里选择编辑的行?
编辑命令要应用于其上的,输入文件中的行可以通过地址来选择。地址可以是行号或者是上下文地址。
通过用花括号(‘{ }’)组合(group)命令,可以用一个地址(或地址对)来控制一组命令的应用。
sed的行号是十进制整数。在从输入读入每一行的时候,增加一个行号计数器;行号地址匹配(选择)导致这个内部计数器等于地址行号的输入行。计数器在多个输入文件上累计运行,在打开一个新文件的时候它不被复零(reset)。
作为特殊情况,字符 $ 匹配输入文件的最后一行。
上下文地址是包围在斜杠中(‘/’)的模式(‘正则表达式’)。sed 识别的正则表达式被构造如下:
&&&* 1) 普通字符(不是下面讨论的某个字符)是一个正则表达式,并且匹配这个字符。
* 2) 在正则表达式开始处的‘^’符号(circumflex)匹配在行开始处的空(null)字符。
* 3) 在正则表达式结束处的美元符号‘$’匹配在行结束处的空字符。
* 4) 字符‘"n’匹配内嵌的换行字符,而不是在模式空间结束处的换行。
* 5) 点‘.’匹配除了模式空间的终止换行之外的任何字符。
* 6) 跟随着星号‘*’的正则表达式,匹配它所跟丛的正则表达式的任何数目(包括 0)的毗连出现。
* 7) 在方括号‘[ ]’内的字符串,匹配在字符串内的任何字符,而非其他。但是如果这个字符串的第一个字符是‘^’符号,正则表达式匹配除了在这个字符串内的字符和模式空间的终止换行之外的任何字符。
* 8) 正则表达式的串联(concatenation)是正则表达式,它匹配这个正则表达式的成员所匹配的字符串的串联。
* 9) 在顺序的‘"(’和‘")’之间的正则表达式,在效果上等同于没有它修饰的正则表达式,但它有个副作用,将在下面的 s 命令和紧后面的规定 10 中描述。
&&& * 10) 表达式‘"d’意味着与在同一个表达式中先前的‘"(’和‘")’中包围的表达式所匹配的那些字符同样的字符串。这里的 d
是一个单一的数字;指定的字符串是‘"(’的从左至右的第 d
个出现所起始的字符串。例如,表达式‘^"(.*")"1’匹配开始于同一个字符串的两次重复出现的行。
* 11) 孤立的空正则表达式(就是‘//’)等价于编译的最后一个正则表达式。
注意:要使用正则表达式的元字符(^ $ . * [ ] " /)中的某一个字符作为文字(去匹配输入中它们自身的出现),要对这个特殊字符前导一个反斜杠‘"’。
有的sed命令可能有 0,1 或 2 个地址。在每个命令中都给出了允许的地址的最大数目。地址多于最大允许个数的命令被认为是错误的。
如果命令没有地址,它应用于输入中每个行。
如果命令有一个地址,它应用于匹配这个地址的所有行。
如果命令有两个地址,它应用于匹配第一个地址的第一行,和直到(并包括)匹配第二个地址的第一个后续行的所有后续行。接着在后续的行上再次尝试匹配第一个地址,并重复这个处理。两个地址用逗号分隔。
/an/&&&&&&&&
匹配我们样例文本的第 1, 3, 4 行
/an.*an/&&&&
匹配第 1 行
/^an/&&&&&&&
没有匹配行
/./&&&&&&&&&
匹配所有行
/"./&&&&&&&&
匹配第 5 行
/r*an/&&&&&&
匹配第 1,3, 4 行(number = zero!)
/"(an").*"1/ 匹配第 1 行
sed的命令格式:
[address1]command
[address1],[address2]command
前者表示sed对匹配地址的行进行操作
后者表示sed对从匹配地址1的行到匹配地址2的行之间(包括地址1和地址2行)所有的行进行操作
另外sed命令还可以用大括号进行分组,使其作用于同一个地址:
[address]{
[address]{command1;command2;command3}
注意:sed的[address]是正则表达式,并且要用/ /限定范围,如:
如果sed命令之间用;分隔,可以将多个命令写在同一行,如:n;d;s/sdfd//g
sed脚本的注释行第一个字符必须是"#"号,如:
#wstar.scd:xxxx
sed的命令函数:
sed命令集由25个命令组成,而且sed的命令大多是用单个字符表示。
n(读取下一行)
[address]n
读取[address]匹配行的下一行
n命令改变了正常的流控制,导致输入的下一行取代模式空间中的当前行,如:
/^".H1/{n;/^$/d}&&&&&
#将匹配匹配^".H1的下一空行删除
=(打印行号)
[address]=
在stdout,打印匹配的行号,如:
p(打印行):
/address/p
在stdout,打印匹配的行
[address]d
如果模行匹配address,那么就删除整个这一行
[address1],[address2]d
删除匹配address1和address2中间的所有行
注意:不允许在被删除的行上做进一步的操作
/^&/,/^".bp/d
a(追加新行):
[address]a"
在匹配address的行后追加新的text行。
注意:必须是a命令后跟一个"用于转义第一个行尾,text必须从下一行开始。
/&larry's address&/a"
4700 Cross Court"
Freach tjck,IN
i(插入新行):
[address]ni"
表示在匹配address的行前插入新的text行。
表示在第n行插入新的text行
注意:必须是i命令后跟一个"用于转义第一个行尾,text必须从下一行开始。
/&larry's address&/i"
4700 Cross Court
.so macros"
.ds CH first draft
q(退出命令):
[address]q
退出命令q会使sed停止读取新的输入行(并停止将他们发送到输出)
向stdout输出1到(n-1)行的内容,到第n行时退出sed
sed '100q' test
c(行更改):
[address]c"
[address1],[address2]c"
注意:必须是i命令后跟一个"用于转义第一个行尾,text必须从下一行开始
c命令删除当前行并且在该位置放置所提供的文本。当想要匹配行并整个取代它时使用c命令。
/^From/,/^$/{
s/^From//p
&Mail Header Removed&
转换语法:y/charators/change-charactors/
y的转换是根据字符的位置来进行的,//里用的不是正则表达式,只是一般的字符序列。它没有词的概念,只是简单的将对应位置上的字符作替换。
注意:charactors和change-charactors的字符数目要一致。
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
替换命令语法为[address]s/pattern/replacement/flags
修饰替换标志flags是:
1-512之间的一个数字,表示在模式空间里对匹配pattern的字符串第n次出现后开始进行替换,将替换后的行输出stdout
对模式空间里匹配pattern的字符串进行全局替换,将替换后的行输出stdout
将匹配行的内容替换后输出stdout
将模式空间内容写到文件file中
替换命令s应用于与[address]匹配的行。如果没有指定行,那么就应用于与pattern匹配的所有行。
在repalcement里可以利用&符号,表示在替换字符串中引用pattern整个匹配内容,如:
s/See Section [1-9][0-9]*".[1-9][0-9]*/(&)/&&&&&&&&
#给匹配的字符串添加小括号()
sed的控制流函数:
[address]!command&&
#在不匹配的行,执行sed命令
[address1],[address2]!command
非命令导致(写在同一行上的)下一个命令,应用到所有的且只能是未被地址部分选择到那些输入行上。
#删除不是空行的所有行
组合命令‘{’导致下一组命令作为一个块而被应用(或不应用)到组合命令的地址所选择的输入行上。在组合控制下的的命令中的第一个命令可以出现在与‘{’相同的一行或下一行上。
组合的命令由自己独立在一行之上的相匹配的‘}’终止。
组合可以嵌套。
:label(标签)
标签是任意不多于7个字符的序列。标签本身占据一行并以冒号开始:,如:
标签将被分支b和测试t命令调用,改变sed控制流。
注意不要在标签后插入空格
branch命令用于脚本将控制权转移别处。
[address]b &label&
label是可选的,如果没有给出label,sed对该行的控制流就会自动转移到结尾处。如果有label就继续执行标签后的行。
/^".ES/,/^".EE/b
s/@DQ@/"/g
/pattern/b top
#模式pattern不匹配时,sed执行command1,command2,command3
#模式pattern匹配时,控制流会跳转到标签top处,sed执行command1,command2,command1,command2,command3
/pattern/b end
#模式pattern不匹配时,sed执行command1,command2,command3
#模式pattern匹配时,sed执行command1,command3
t(测试是否成功替换)
test命令用于判断当前匹配的地址上是否进行了成功替换?成功替换sed的控制流就转到标签。
[address]t &label&
label是可选的,如果没有给出label,sed对该行的控制流就会自动转移到结尾处。如果有label就继续
s/""(.*")"/"2,"3/g
s/""(.*")"/"1,"2/g
more commands
#若该行有替换,则直接跳到break标签处执行下边命令
匹配多行:
假设我们的目标文件test内容是这样的:
file content
aabbcc&&&comment part 1
comment part 2&&&
现在需要把&&&...&&&这一段替换为“COMMENT”,那么sed语法应当是:
/&&&/,/&&&/ {
s/&&&.*&&&/COMMENT/;
上述语句存储在test.sed中,那么执行的方式和结果就是:
$ sed -f test.sed test
file content
aabbccCOMMENT
把正则直接写到命令里面也可以,用“;”来分隔命令即可:
$ sed -e ": /&&&/,/&&&/ { /&&&/! { $! { N; b begin }; }; s/&&&.*&&&/COMMENT/; };" test
file content
aabbccCOMMENT
注意右花括号之后也要加上分号“;”,如果再加上-i参数就可以直接把改动写到原文件中去了。
怎么样?看懂了么?我来详细说明吧,看那个多行命令的test.sed文件的内容:
首先花括号{}代表命令块的开始,类似c的语法,后面就不再说了。
:begin,这是一个标号,man中叫做label,也就是跳转标记,供b和t命令用,本例中使用了b命令。
/&&&/,/&&&/,这是一个地址范围(Addresses),后面
{}中的命令只对地址范围之间的内容使用。其中逗号前面的部分是开始地址,逗号后面是结束地址,都是正则表达式。由于sed是“流”式“行”处理,所以结
束地址是可以省略的,即如果地址的结束范围不存在,那么将一直处理到文件结尾。本例中使用这个地址范围主要是缩小处理的数据量,因为虽然后面用N命令把对
一行的处理扩展为了多行,但如果从文件开头一直N扩展到&&&出现为止,buffer中要处理的字符串可能会很长,影响效率。所以去掉
这个处理范围也是能够得到正确结果的,比如:
$ sed -e ": { /&&&/! { $! { N; b begin }; }; s/&&&.*&&&/COMMENT/; };" test
$ sed -e "{:
/&&&/! { $! { N; b begin }; }; s/&&&.*&&&/COMMENT/; };" test
/&&&/!,&&&是要替换内容的结束标记,带上!就是说当一行处理完毕之后,如果没有发现结束标记。。。
$!,$在正则中表示字符串结尾,在sed中代表文件的最后一行,本句和上一句结合起来的意思就是:如果在本行没有发现结束标记,并且当前扫描过的行并不是文件的最后一行。
N;,把下一行的内容追加(append)到缓冲区(pattern)之后,在我们的例子中,在处理aabbcc&&&comment part 1这一行的内容时,就会执行到这里,然后把下一行的内容comment part 2&&&一起放入缓冲区,相当于“合并”成了一行(sed的缓冲区中默认都只会包含一行的内容)。
b begin,由于仍然没有找到结束标记&&&(注意上一条说的缓冲区还没有被处理),所以在这里跳回到标号begin,重新开始命令。如果开始和结束标记之间间隔了多行,那么就会有多次跳转发生。
s/&&&.*&&&/COMMENT/;,终于,/&&&/!不再匹配成功,也就是我们已经找到了结束标记,那么用s命令来进行替换。如果开始和结束标记在一行的话,就会越过上面那些复杂的处理,直接执行到这里了。
/hellolinuxworld/blog/item/5e3aabc76309.html
有兴趣可以访问下我的生活博客:
阅读(3548)
&re: SED最佳参考[未登录]
找了很久,这篇非常好。感谢分享啊。。&&&&&&
积分与排名
阅读排行榜
评论排行榜

我要回帖

更多关于 元芳是什么意思 的文章

 

随机推荐