电脑技术学习

使用 UNIX 进行文本处理

dn001
chrish@dhcp3 [338]$ echo "This is a test" | sed -e s/[aeiouy]/_/g
Th_s _s _ t_st

  请注意,示例中使用了 g 标志,以便将模式/替换应用于所有的匹配项,而不仅仅是第一个匹配项。

  sed 命令也可以理解 tr 命令所支持的那些命名字符类,POSIX 对这些字符类进行了定义,但是本文中的语法稍有不同。清单 10 显示了如何替换任何空白字符(制表符、空格等等):

  清单 10. 根据命名字符类匹配内容

chrish@dhcp3 [345]$ echo -e 'hello  there' 
hello  there
chrish@dhcp3 [346]$ echo -e 'hello  there' | sed -e 's/[[:space:]]/, /'
hello, there

  echo 命令的 -e 标志用来告诉该命令扩展 C 风格的转义字符,在本示例中,它会把    转换为制表符。

  您还可以使用“.(点号)匹配任何单个的字符。如果您需要处理一些略有变化的数据,或者包含难以进行转义的特殊字符的数据,那么使用这个符号是非常方便的。例如,在匹配引号时,我经常使用 .,所以我不需要在 Shell 中对引号进行转义。清单 11 显示了一个正则表达式初学者在使用这个模式时出现的问题。

  清单 11. 这可能并不是想要的结果

chrish@dhcp3 [339]$ echo "This is a test" | sed -e s/./_/g
______________

  既然您已经了解了这些非常基本的内容,下面介绍一些附加模式修饰符,要使用高级 正则表达式,您现在还可以使用 -E 选项代替 -e。? 字符表示匹配前面模式元素的零个或一个实例,* 字符表示匹配前面元素的零个或多个实例。+ 字符表示匹配一个或多个前面的元素。^ 字符匹配行首,而 $ 则匹配行尾。清单 12 显示了实际应用中的情况。

标签: