强大的sed sed [选项] s e d命令输入文件/sed [选项] -f sed脚本文件输入文件/s e d脚本文件 s e d选项如下: n 不打印;s e d不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。 c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条s e d命令,此选项无用,但指定它也没有关系。 f 如果正在调用s e d脚本文件,使用此选项。此选项通知s e d一个脚本文件支持所有的s e d命令,例如:sed -f myscript.sed input_file,这里m y s c r i p t . s e d即为支持s e d命令的文件。 s e d定位文本的一些方式: x x为一行号,如1 x , y 表示行号范围从x到y,如2,5表示从第2行到第5行 / p a t t e r n / 查询包含模式的行。例如/ d i s k /或/[a-z]/ / p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s / p a t t e r n / , x 在给定行号上查询包含模式的行。如/ r i b b o n / , 3 x , / p a t t e r n / 通过行号和模式查询匹配行。3 . / v d u / x , y ! 查询不包含指定行号x和y的行。1 , 2 ! 基本sed编辑命令 p 打印匹配行 = 显示文件行号 e.g. sed -n -e '/music/p' -e '/music/=' quote.txt 第一个命令打印模式匹配行,第二个使用=选项打印行号 a \ 在定位行号后附加新文本信息 e.g. sed "/company/a\Then suddenly it happened." quote.txt i \ 在定位行号后插入新文本信息 e.g. sed "/company/i\Utter confusion followed." quote.txt d 删除定位行 c \ 用新文本替换定位文本 e.g. sed "/honeysuck/c\The Office Dibble band played well." quote.txt s 使用替换模式替换相应模式 r 从另一个文件中读文本 w 写文本到一个文件 q 第一个模式匹配完成后推出或立即推出 l 显示与八进制A S C I I代码等价的控制字符 { } 在定位行执行的命令组 n 从另一个文件中读文本下一行,并附加在下一行 g 将模式2粘贴到/pattern n/ y 传送字符 n 延续到下一输入行;允许跨行的模式匹配语句 sed -n '4,/The/p' quote.txt 这个模式如果在指定行找不到符合条件的,就从下一行开始查找,直到找到为止,并把,找到行之前的全部打打印出来。 如果指定行本身就符合条伯,把本行及后面的行的全部打印出来 替换文本 替换命令用替换模式替换指定模式: [ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n] 使用替换修改字符串 如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面。 e.g. sed -n 's/nurse/"hello" &/p' quote.txt 从文件中读文本 处理文件时, s e d允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在模式匹配行后。 e.g. sed '/company./r sedex.txt' quote.txt
匹配后退出 有时需要在模式匹配首次出现后退出s e d,以便执行其他处理脚本。 e.g. sed '/.a.*/q' quote.txt 从shell向sed传值 要从命令行中向s e d传值,值得注意的是用双引号,否则功能不执行。REPLACE="GO"; sed "s/go/$REPLACE/g" quote.txt 下面是一些一行命令集。([ ]表示空格, [ ]表示t a b键) ‘s / \ . $ / / g’ 删除以句点结尾行 ‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替 ‘s / ^ [ ] [ ] * / / g’ 删除行首空格 ‘s / \ . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格 ‘/ ^ $ / d’ 删除空行 ‘s / ^ . / / g’ 删除第一个字符 ‘s /CO L \ ( . . . \ ) / / g’ 删除紧跟C O L的后三个字母 ‘s / ^ \ / / / g’ 从路径中删除第一个\ ‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代 ‘S / ^ [ ] / / g’ 删除行首所有t a b键 ‘s / [ ] * / / g’ 删除所有t a b键 在这个特别的规则表达式中,出现了 '[[:space:]]' 字符类。这只是一个特殊的关键字,它告诉 sed 与 TAB 或空格匹配。如果愿意的话,可以不输入 '[[:space:]]',而输入 '[',然后是空格字母,然后是 Ctrl-V,然后再输入制表键字母和 ']' -- Control-V 告诉 bash 要插入“真正”的制表键,而不是执行命令扩展。使用 '[[:space:]]' 命令类(特别是在脚本中)会更清楚。 solaris当然还是要用/usr/xpg4/bin/sed.
关于 's///' 命令的另一个妙处是 '/' 分隔符有许多替换选项。如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在 's' 之后指定一个不同的字符来更改分隔符。sed -e 's:/usr/local:/usr:g' mylist.txt 在该例中,使用冒号作为分隔符。 更多字符匹配 '[ ]' 规则表达式语法还有一些附加选项。要指定字符范围,只要字符不在第一个或最后一个位置,就可以使用 '-',如下所示: '[a-x]*' 这将匹配零或多个全部为 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 '[:space:]' 字符类来匹配空格。以下是可用字符类的相当完整的列表:
字符类 描述 [:alnum:] 字母数字 [a-z A-Z 0-9] [:alpha:] 字母 [a-z A-Z] [:blank:] 空格或制表键 [:cntrl:] 任何控制字符 [:digit:] 数字 [0-9] [:graph:] 任何可视字符(无空格) [:lower:] 小写 [a-z] [:print:] 非控制字符 [:punct:] 标点字符 [:space:] 空格 [:upper:] 大写 [A-Z] [:xdigit:] 十六进制数字 [0-9 a-f A-F] 一个地址的多个命令 有时,可能要指定应用到一个地址的多个命令。这在执行许多 's///' 以变换源文件中的字和语法时特别方便。要对一个地址执行多个命令,可在文件中输入 sed 命令,然后使用 '{ }' 字符将这些命令分组,如下所示:1,/^END/{ s/[Ll]inux/GNU\/Linux/g s/samba/Samba/g s/posix/POSIX/g p } |