新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1.sed的概念
创新互联自成立以来,一直致力于为企业提供从网站策划、网站设计、网站设计制作、成都网站建设、电子商务、网站推广、网站优化到为企业提供个性化软件开发等基于互联网的全面整合营销服务。公司拥有丰富的网站建设和互联网应用系统开发管理经验、成熟的应用系统解决方案、优秀的网站开发工程师团队及专业的网站设计师团队。
sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。sed 是基于Basic模式的,sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。
2.sed的工作原理
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓
冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理
完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件
内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化
对文件的反复操作。
3.sed的命令行格式
sed命令行的基本格式为:
sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...
sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可
以一次传入多个文件,sed会依次处理。sed的编辑命令可以直接当命令行参数传入,也可以写
成一个脚本文件然后用-f参数指定,编辑命令的格式为/pattern/action
其中pattern是正则表达式,action是编辑操作。sed程序一行一行读出待处理文件,如果某
一行 与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个
action将作用于待处理文件的每一行。
4.sed命令和选项
命令
a\ : 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c\ : 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行尾需
用”\"续行
i\ :在当前行之前插入文本。多行时除最后一行外,每行末尾需用”\"续行d删除 行
h : 把模式空间里的内容复制到暂存缓冲区
H :把模式空间里的内容追加到暂存缓冲区
g :把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
G:把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
l :列出非打印字符
p :打印行
n :读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q :结束或退出sed
r :从文件中读取输入行
! :对所选行以外的所有行应用命令
s :用一个字符串替换另一个
g :在行内进行全局替换
w :将所选的行写入文件
x :交换暂存缓冲区与模式空间的内容
y :将字符替换为另一字符(不能对正则表达式使用y命令)
注:红色字体标注的是重点掌握的
选项
-e :进行多项编辑,即对输入行应用多条sed命令时使用
-n :取消默认的输出
-f :指定sed脚本的文件名
5.sed的基本使用
1>/pattern/p:打印匹配pattern的行
使用p命令需要注意,sed是把待处理文件的内容连同处理结果一起输出到标准输出的,
因此p命令表示除了把文件内容打印出来之外还额外打印一遍匹配pattern的行。比如一个
文件file的内容是
满足以1开头的行并打印:
要想只输出处理结果,应加上-n选项,这种用法相当于grep命令
2> /pattern/d:删除匹配pattern的行
删除file中以6结尾的行
注意,sed命令不会修改原文件,删除命令只表示某些行不打印输出,而不是从原文件中删去。
3> /pattern/s/pattern1/pattern2/:查找符合pattern的行,如果不加g的话就
将该行第一个匹配pattern1的字符串替换为pattern2,如果加g的话就将该行所有pattern1替换为pattern2.
4>在替换中&符号和\1 的使用
&符号相当于要替换的字符串本身,\1和&符合有相同的作用
5> sed -i : 做的操作会修改原文件
6>定址
例如打印file里的1-2行内容
5.模式空间和保持空间
sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中
的“sedcommand(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后
该行被输出,模式(pattern space)被清空;接着,在重复执行刚才的动作,文件
中的新的一行被读入,直到文件处理完毕。
一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即
可完成主要任务。但是某些时候,使用通过使用保持空间(hold space),还可以
带来意想不到的效果。
模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。
保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。
正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!
sed命令:
+ g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来 pattern space里的内容清除
+ G:[address[,address]]G 将hold space中的内容追加到pattern space\n后
+ h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来 的hold space里的内容被清除
+ H:[address[,address]]H 将pattern space中的内容追加到hold space\n后
+ d:[address[,address]]d 删除pattern中的所有行,并读入下一行到pattern中
+ D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行
+ x:交换保持空间和模式空间的内容
+N:表示读取下一行追加到pattern中
+n:表示读取下一行到pattern中
命令练习:
1>给test文件里的每一行后加一空行
2>用sed模拟出tac的功能(倒序输出)
解析逆序的过程:
如果是第一行的话,先读取到pattern space,再将其拷贝到hold space,不是最
后一行的话,删除pattern space 里的东西,在进行下次读取,然后将hold里的内
容追加到pattern,在将pattern拷贝到hold,重复上述的过程,将将文件的内容逆
序了。
3>追加匹配行到文件结尾
4>行列转换
5>求1~100的求和
6>打印奇偶行
7>1-100再求和
:a表示标签a,ba表示跳转到a标签,$表示最后一行,!表示不做后续操作,所
以,$!ba表示最后一行不用跳转到a标签,结束此次操作。