|
作者对sed总结的很好,所以转帖了:
原帖地址: http://blog.da-fang.com/2009/09/linux-sed-script-%25e6%258e%25a7%25e5%2588%25b6%25e7%25ac%25a6-%25e5%2591%25bd%25e4%25bb%25a4%25e8%25af%25a6%25e8%25a7%25a3/
今天下午终于抽空研究了下sed。Sed是一个非交互性上下文编辑器,它被设计用来在以下环境中发挥作用:
可以直接操作或编辑那些对常规编辑器而言太大的文件。相信很多人都有过打打开一个大文件会拖死你的电脑的情况;编辑命令太复杂(windows上貌似不存在这种情况,用命令行的linux就难说了)很难以在交互模式下编辑文件;要在对输入的一趟扫描中有效的进行多个‘全局’(global)编辑函数在开始介绍sed的控制符与语法之前,先概述几个概念:四个空间:input stream, pattern buffer, output stream 和 hold buffer基本操作过程:将 input stream 的当前行放入 pattern buffer, 然后 input stream 的指针指向下一行 ;对 pattern buffer 中的行进行处理 ;将上面的处理结果放入 output stream. 然后循环这个过程 .hold buffer 是另一个空间 , 可以通过命令和 pattern buffer 进行交互 .Sed命令介绍:一: 基本命令:字符串替换:’s’基本用法:e.g. sed ‘s/day/night/’ new该例子将文件 old 中的每一行第一次出现的 day 替换成 night, 将结果输出到文件 new对上述例子的说明:s 表示替换命令 /../../ 分割符 (Delimiter),第一个/../表示要搜索的字符或正则表达式,也就是上面例子中的’day’;第二个/../表示要用来替换的字符串,也就是上面例子中的’night’用 & 表示匹配的字符串有时可能会想在匹配到的字符串周围或附近加上一些其它的字符,那么可以像下面这样来操作:sed ‘s/abc/(abc)/’ new该例子从old文件中读取字符,在找到的 abc 前后加上括号,然后协会到文件new。该例子还可以写成sed ‘s/abc/(&)/’ new #效果和上面的一样下面是更复杂的例子 :sed ‘s/[a-z]*/(&)/’ newsed ‘s/[0-9]*/& &/’ new用 \1, \2, …, \9 来表示匹配的字符串先看个例子:sed ‘s/\([a-z]*\)[0-9]*/\1/’ new #本例中 \1 就是指前面的 \([a-z]*\)#如果在old文件中有内容:abc123 abc123那么在new文件中将会是:abc abc\1, \2, …, \9 也可以出现在搜索字符串中,例如:sed ‘s/\([a-z]*\) \1/\1/’ new #本例可以去除重复的由字母组成的词替换选项1.4.1 /g 替换所有的sed 默认只替换搜索字符串的第一次出现 , 利用 /g 可以替换搜索字符串所有出现的地方, 例如:sed ‘s/\([^ ]*\)/(&)/g’ new1.4.2 用 /1, /2, … 来表明替换哪一次出现sed ‘s/[^ ]*//2′ new #替换搜索到的第二次出现,可以从 /1 用到 /5121.4.3 /p print 选项当 sed 命令有 -n 选项时 , 该命令没有输出,例如,sed -n ‘s/\([a-z]*\)[0-9]*/\1/’ |
|
|