sed

发表于:2007-05-26来源:作者:点击数: 标签:
为了搞定 oracle 备份中版本保留的问题,不得以看这些东西。感觉为了抓一个小蚂蚁,找了个挖土机来挖蚁窝! http://www-900.ibm.com/developerWorks/cn/linux/shell/sed/sed-1/index.shtml 郁闷,这些都白写了! 字符 描述 与行首匹配 与行末尾匹配 与任一个

为了搞定oracle备份中版本保留的问题,不得以看这些东西。感觉为了抓一个小蚂蚁,找了个挖土机来挖蚁窝!

http://www-900.ibm.com/developerWorks/cn/linux/shell/sed/sed-1/index.shtml

郁闷,这些都白写了!

字符描述
与行首匹配
与行末尾匹配
与任一个字符匹配
将与前一个字符的零或多个出现匹配
[ ]与 [ ] 之内的所有字符匹配

感受规则表达式的最好方法可能是看几个示例。所有这些示例都将被 sed 作为合法地址接受,这些地址出现在命令的左边。下面是几个示例:

规则
表达式
描述
/./将与包含至少一个字符的任何行匹配
/../将与包含至少两个字符的任何行匹配
/^#/将与以 '#' 开始的任何行匹配
/^$/将与所有空行匹配
/}^/将与以 '}'(无空格)结束的任何行匹配
/} *^/将与以 '}' 后面跟有或多个空格结束的任何行匹配
/[abc]/将与包含小写 'a'、'b' 或 'c' 的任何行匹配
/^[abc]/将与以 'a'、'b' 或 'c'开始的任何行匹配

在这些示例中,鼓励您尝试几个。花一些时间熟悉规则表达式,然后尝试几个自己创建的规则表达式。可以如下使用 regexp:

$ sed -e '/regexp/d' /path/to/my/test/file | more


这将导致 sed 删除任何匹配的行。然而,通过告诉 sed打印 regexp 匹配并删除不匹配的内容,而不是与之相反的方法,会更有利于熟悉规则表达式。可以用以下命令这样做:

$ sed -n -e '/regexp/p' /path/to/my/test/file | more


请注意新的 '-n' 选项,该选项告诉 sed 除非明确要求打印模式空间,否则不这样做。您还会注意到,我们用 'p' 命令替换了 'd' 命令,如您所猜想的那样,这明确要求 sed 打印模式空间。就这样,将只打印匹配部分。

# sed -e '/^$/d' 9
george noNEWLINE georges
george noNEWLINE georges
# sed -e '/^$;G' 9
sed: 0602-404 Function /^$;G cannot be parsed.
# sed -e '/^$/d;G' 9
george noNEWLINE georges

george noNEWLINE georges

# sed -e '/[g]/d' 9

# sed -e '/regexp/p' 9
george noNEWLINE georges

george noNEWLINE georges
# sed -e '/regexp/p' 9|more
george noNEWLINE georges

george noNEWLINE georges
# sed -n -e '/^$/d' 9
# sed -n -e '/^$/p' 9

#

指定两个用逗号分开的规则表达式,sed 将与所有从匹配第一个规则表达式的第一行开始,到匹配第二个规则表达式的行结束(包括该行)的所有行匹配。例如,以下命令将打印从包含 "BEGIN" 的行开始,并且以包含 "END" 的行结束的文本块:

$ sed -n -e '/BEGIN/,/END/p' /my/test/file | more


如果没发现 "BEGIN",那么将不打印数据。如果发现了 "BEGIN",但是在这之后的所有行中都没发现 "END",那么将打印所有后续行。发生这种情况是因为 sed 面向流的特性 -- 它不知道是否会出现 "END"。

原文转自:http://www.ltesting.net