sed:流式编辑器,把前一个程序的输出结果引入sed的输入,经过一系列编辑命令转换为另种格式输出

命令的基本格式:

sed option 'script' file1 file2 ...

sed option -f scriptfile file1 file2 ...

其中处理的文件可以由标准输入重定向得到,也可由命令行参数传入,sed会依次处理传入的多个文件,然后逐行进行处理

sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文件然后由-f参数指定,编辑命令的格式为 /pattern/action

pattern为正则表达式,action为符合条件的正则表达式所要执行的相应动作

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲

区中,称为“模式空间”(pattern space),接着使用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往标准输出。接着处理下一行,这样不断重复,直到文件末尾。而该操作使文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件

如下图所示,sed的操作过程

wKioL1dyZS_g3e-xAABjCrYC9Rw562.png-wh_50

sed的使用操作

1.输出符合正则表达式的行,只输出以2结尾的行,需要加上-n选项

wKioL1dyZW3g1OUHAABmHMEmWH0263.png-wh_50

2.删除符合正则表达式的行,删除以3结尾的行

wKioL1dyZxyicfY-AAA3ayij1lE361.png-wh_50

3.查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2,需要加上s指令

wKiom1dyaBzwY-56AAAmcoRbOTY075.png-wh_50wKioL1dyamezPqi4AAAp1V-w4tI032.png-wh_50

wKiom1dyaguhcTxzAAAhVlcjepk300.png-wh_50

其中使用-i选项会更改文件的内容

4.查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2,在编辑命令后加上g表示全替换

查找以1开头的行,将该行的每个1都替换为~1~,其中&符号表示pattern1的内容

wKiom1dybFnRIQH2AAAePdAVYM8309.png-wh_50

对所有数字行进行处理

wKiom1dybW_gLYNgAAAg-rbpkDE314.png-wh_50

对数字和字母行进行处理

wKiom1dybrLiX8_UAAAkj3q8gqs598.png-wh_50

给每行后加上换行符

wKiom1dyb0ihQ2VTAAAtdh2oqj4112.png-wh_50

4.定址:用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或两者的结合,如果没有指定地址,sed将处理输入文件的所有行

打印指定行

wKiom1dycRzAeqbUAAAyZPMBtv0867.png-wh_50

打印某一区域内的所有行

wKioL1dycdzBkA_dAABCJQVRDBQ732.png-wh_50

也可通过管道先找到前15行再显示出后5行,不过使用sed命令就更简便些了

如果没有定址,sed将显示所有行

wKiom1dycuzBmAIfAAAzVz_f3l4142.png-wh_50

查找从1到3结尾的行并显示

wKiom1dydMySZi39AAAz2BAr3eA760.png-wh_50

5.保持空间与模式空间转换相关命令和选项

wKioL1dydezweMreAAGLuJXXnrE988.png-wh_50

wKiom1dyds6S39nLAAB2TdRyiNs731.png-wh_50

wKioL1dyjP2DHFgmAAAizuNBkj4649.png-wh_50

1.给每行的结尾加一个空行,因为保持空间开始的内容为空,因此把保持空间的内容追加到模式空间中,即给每行后加上一个空行

wKioL1dydy_AIPv2AAArY793jmA665.png-wh_50

2.逆序输出文件中内容

可以使用tac工具输出

wKiom1dyd_-CMgHDAAApC_zKnMg130.png-wh_50

使用sed命令实现

wKioL1dyeG3RBSpgAAAxH1pcts8324.png-wh_50

该条编辑命令为:若为第1行则不做紧跟在后边的G操作,但做h(将模式空间内容拷贝到保持空间,删除原来保持空间的内容)操作,即不把保持空间的内容追加到模式空间,若不是第1行,则做G操作,若为最后一行,则不做d操作,若不为最后一行,则删除模式空间的内容,并读入下一新行到模式空间中

3.追加匹配行到文件结尾

查找以9结尾的并追加到文件结尾

wKiom1dyesmincXiAABDu5lwecA221.png-wh_50

若为第一行则先进行H操作,再拷贝一次

wKioL1dye3bDoHicAAA-lSk0fKk911.png-wh_50

4.行列转换

wKiom1dye8nDTc1iAABYyP3ZhuE377.png-wh_50

wKioL1dygWChSNUjAAAoTDtMMG8123.png-wh_50

wKiom1dygb7CuINCAABZmamc7uk114.png-wh_50

在模式空间行的结尾进行x,每行的结尾的\n用空格代替

5.1到100的求和

H表示把模式空间的内容追加到保持空间中去,H可以带一个地址,如$,表示到文件的末尾,然后用x将之取到模式空间中,把\n替换成空格,再打印 

wKioL1dyhFCy93qZAABVXsc_BUc373.png-wh_50

也可使用类C式的goto语句

wKioL1dyhbWBWm62AABBqkURGW8418.png-wh_50

:a表示标签a,ba表示跳转(break)到a标签,$!表示最后一行不做后续操作,$!ba表示最后一行不跳转到标签a,结束此次操作

6.打印偶数行或基数行

wKiom1dyhqfxbszVAABFFsuv3L8965.png-wh_50

7.注释转换

给每行加上注释,再底行模式下使用以下命令

wKioL1dyh9ewXxehAAA4zvfNCQA838.png-wh_50

对满足正则表达式的行去注释

wKioL1dyiMLyiZt3AAAubCGozaI516.png-wh_50

给满足正则表达式的行加上注释

wKioL1dyieCxnfsXAAA0oaI_Jzg694.png-wh_50

从某行开始加上后半部分注释

wKiom1dyjFWSPoE1AAA_jw87gnQ659.png-wh_50

注释转换

wKiom1dyimvAEwFxAABBzIfyjV4761.png-wh_50

wKioL1dyizyzAR7aAAA0SLmCFss398.png-wh_50