sed详解---进阶篇(一)

来源:互联网 发布:手游多开软件 编辑:程序博客网 时间:2024/06/09 18:56

前言

与grep一样,sed也支持特殊元字符,来进行模式查找,替换,不同的是,sed使用的正则表达式是括在斜杠线“/”之间的模式

如果要把正本表达式分隔符”/”改为另一个字符,比如o,只要在这个字符前加一个反斜线,在字符后跟上正则表达式,再跟上这个字符即可,例如:sed -n ‘\o^Myop’ datefil

正则表达式

符号 说明 范例 ^ 行首定位符 /^my/ : 匹配所有以my开头的行 $ 行尾定位符 /my$/: 匹配所有以my结尾的行 : 匹配除换行符以外单个字符 /m..y/:匹配包含字母m,后面再跟两个字符,再跟字母y的行 * 匹配零个或多个前导字符 /test*/:匹配包含string tes,后跟零个或多个t字母的行 [] 匹配指定字符组内任意一个字符 /t[eE]st/:匹配包含test和tEst的行 [^] 匹配任意一个不在字符组内的字符 /t[^eE]st/:匹配不包含test和tEst的行 \(…\) 保存已匹配的字符:标记元字符之间的模式,并将其保存为标签1,之后可以用\1来引用它,最多可以定义九个标签 sed ‘1,3s/\(tes\)t/\1tttt/g’:对1到3行进行处理,tes被保存为1,如果发现tes将会替换为testttt & 保存查找串以便在替换串中引用 s/test/*&*/ :查找匹配test的串,并替换为test \< 词首定位符 /\ > 词尾定位符 /my>/:匹配包含my结尾的单词的行

模式空间保持空间(高级用法,难度较高)

sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中的“sed -command(sed命令)”就一条jiezheyi条处理,直到脚本执行完毕,然后该行被输出,模式空间被清空,然后,再重复刚才的动作,文件中的新的一行被读入,直到文件处理完毕
工作流程图如下:
这里写图片描述

一般情况下,数据处理只用模式空间(pattern space),按照上述逻辑可以完成主要任务,但是某些时候,通过使用保持空间(hold space),还可以带来意想不到的效果
模式空间:可以想成工厂里的流水线,数据直接在上面进行处理
保持空间:可以想象成仓库,在我们进行数据处理的时候,作为数据的暂存区域

正常情况下,如果不显式使用某些高级命令,保持空间不会用到

高级命令:

+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 space中的所有行,并读取新的一行到pattern中
+D: [address,[,address]]D,删除multiline pattern中的一行,不读入下一行
x:交换模式空间和保持空间的内容

见如下例子

1.给每行结尾添加一个空行

这里写图片描述

2.用sed 模拟除tac的功能(倒序输出)
这里写图片描述

1!G表示第一行不执行G,$!d表示最后一行不删除,距离流程可以参照上面的指令动手画一遍

3.追加匹配行到文件结尾
这里写图片描述

4,行列转化
这里写图片描述

0 0