当前位置: 首页 > 科技观察

一篇学习shell工具中sed

时间:2023-03-13 02:56:36 科技观察

sed工具执行原理的文章;sed参数和动作的常用操作方法;寻址;模式空间和保持空间;它被称为流编辑器,在shell脚本和Makefiles中非常常用作过滤器,即将前面程序的输出引入到sed的输入中,通过一系列的编辑转换成另一种格式输出命令。我们用一张示意图来理解它的工作模式:编辑命令的格式为sed/pattern/action经过sed处理后,文件内容并没有改变,除非使用重定向来存储输出。sed主要用于自动编辑一个或多个文件;简化对文件的重复操作;根据Basic规范,sed默认为基本匹配!也就是说,像(){}|这样的特殊字符需要转义,否则无法识别,或者使用扩展模式也是可以的。2、下面将着重介绍sed的参数及action(1)-n参数、p命令的action(2)d命令的action(3)/pattern/s/pattern1/pattern2/的操作方法:findtheonethatmatchesthepatternLine,replacethefirststringmatchingpattern1inthislinewithpattern2/pattern/s/pattern1/pattern2/g:Findalinethatmatchespattern,replaceallstringsmatchingpattern1inthislinewithpattern2这个操作是未知有没有想到vim编辑器中的底线模式搜索,它们是相似的。下面总结一下sed中参数的选择和执行:[plain]viewplaincopy参数选择:-n:一般sed命令会将所有数据输出到屏幕上。如果加上-n选项,则只会将sed命令处理过的行输出到屏幕。-e:允许对输入数据应用多个sed命令编辑。-i:将修改结果直接写到读取数据的文件中,而不是输出到屏幕上。(1.文件已被修改;2.可以cat查看)-f:指定sed脚本的文件名。action:a:Append,在当前行之后添加一行或多行。c:行替换,用c之后的字符串替换原来的数据行。i:插入,在当前行之前插入一行或多行。p:print,输出指定行。s:字符串替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字符串/新字符串/g”(如果不加g,表示只替换每行第一个匹配的字符串)。如果你上面没有实践过,有兴趣的可以试试!3、介绍一下sed中的寻址。寻址用于决定要编辑文件中的哪些行。地址的形式可以是数字或正则表达式,或两者的组合。如果没有指定地址,sed将处理输入文件的所有行。以下是一些示例:sed'/start/,/end/d'file#删除包含“start”的行和“end”行之间的行sed'/start/,10d'file#删除包含“start”的行'至第十行内容4.模式空间和持有空间(1)持有空间:用于存储数据,相当于一个仓库,不能处理数据;(2)模式空间:专门以行为为单位处理数据。一般来说,如果某些选项没有明确使用,则不会使用保留空间。[plain]viewplaincopy命令:g:将holdingspace的内容复制到patternspace,patternspace的原值会被覆盖。G:将保持空间的内容附加到模式空间。h:将模式空间的值复制到保持空间会覆盖保持空间的原始值。H:将模式空间的值附加到保持空间。d:删除模式空间中的所有行,并将下一行读入模式空间。D:删除模式空间的第一行,不将下一行读入模式空间。n:输出模式空间的行,读取下一行替换当前模式空间的行,然后执行下一条处理命令,而不是执行第一条命令。N:读取下一行并将其附加到模式空间行的末尾。此时,模式空间中有两条线。x:交换模式空间和保持空间的内容。例1:在每行后面添加一个空行例2:使用sed模拟倒序打印的过程(tac)例3.在文件末尾添加匹配行例4:将一列内容变成一行例5:求1-100的和例6:打印出奇数行和偶数行5.使用label[plain]viewplaincopy:a表示labela;ba表示跳转到一个标签;$表示***一行;!表示没有后续操作,所以,$!ba表示最后一行不需要跳转到a标签,结束本次操作。下面是一个例子:***还有一点:[plain]viewplaincopy和grep一样,sed也支持特殊的元字符进行模式搜索和替换。区别在于sed使用的正则表达式是用斜线“/”括起来的模式。如果要把正则表达式分隔符“/”改成其他字符,比如o,只要在这个字符前加一个反斜杠,在正则表达式的字符后面,再跟在这个字符后面即可。例如:sed-n'\o^56op'datafile^:行首定位符/^my/匹配所有以my开头的行;$:行尾定位符/my$/匹配所有以my结尾的行;.:匹配除换行符之外的单个字符/m..y/匹配包含字母m后跟两个任意字符后跟的行字母y;*:匹配零个或多个前导字符/test*/匹配包含tes的字符串,后跟零个或多个t字母行;[]:匹配指定字符组中的任意字符/t[eE]st/匹配包含test或tEst的行;[^]:匹配不在指定字符组中的任何字符/t[^eE]st/匹配字符串以t开头的行,但st之前的字符不是e或E;&:保存搜索字符串,在替换字符串中引用s/test/*&*/g符号&代表搜索字符串。test将被*test*\<替换:前缀定位器/\:后缀定位符/my\>/匹配包含以my行结尾的单词的行;x\{m\}:m个连续的x如:/9\{5\}/匹配包含5个连续9的行;x\{m,\}:至少mx例如:/9\{5,\}/匹配包含至少5个连续9的行;x\{m,n\}:至少m,但不超过n个xs例如:/9\{5,7\}/匹配包含连续5的行到七个9的行。还有一个单元匹配-替换问题: