第10章 初级班毕业了

“Unix不会阻止用户干蠢事,因为那样也会妨碍用户做聪明的事儿。”——Doug Gwyn

恭喜你坚持到正则表达式初级班毕业。你不再是个初学者了,你已经接触了最常用的正则表达式语法。作为程序员,正则表达式会给你的工作提供更多的改善机会。

学习正则表达式为我节省了不少的时间。让我举个例子吧。

我在工作中经常要使用XSLT,经常要分析XML文件中的标签。

在上一章中我展示过一部分,但现在这里有个更长的单行命令,它从lorem.dita文件中提取一列标签名并转换为简单的XSLT样式表:

  1. grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita | sort | uniq | sed '1 i\
  2. <xml:stylsheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\
  3. ; s/^</\
  4. <xsl:template match="/;s/ id=\".*\"//;s/>$/">\
  5. <xsl:apply-templates\/>\
  6. <\/xsl:template>/;$ a\
  7. \
  8. </xsl:stylesheet>\
  9. '

我知道这个脚本看起来很复杂,但你若长期使用这些东西之后,会培养出新的思维方式。我不打算解释这个脚本执行的操作了,因为我确信你可以自己弄明白。

该脚本的输出如下:

  1. <xml:stylsheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2. <xsl:template match="body">
  3. <xsl:apply-templates/>
  4. </xsl:template>
  5. <xsl:template match="li">
  6. <xsl:apply-templates/>
  7. </xsl:template>
  8. <xsl:template match="p">
  9. <xsl:apply-templates/>
  10. </xsl:template>
  11. <xsl:template match="title">
  12. <xsl:apply-templates/>
  13. </xsl:template>
  14. <xsl:template match="topic">
  15. <xsl:apply-templates/>
  16. </xsl:template>
  17. <xsl:template match="ul">
  18. <xsl:apply-templates/>
  19. </xsl:template>
  20. </xsl:stylesheet>

这只是个开头。当然,要让这个简单的样式表变得有用还需要做很多编辑工作,但这样可以让你少键入很多东西。

我承认如果在文件中用以下sed命令则会更简单。事实上,我就这样做了。你可以在示例代码库中找到xslt.sed文件。下面是该文件的内容:

  1. #!/usr/bin/sed
  2. 1 i\
  3. <xml:stylsheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\
  4. s/^</\
  5. <xsl:template match="/;s/ id=\".*\"//;s/>$/">\
  6. <xsl:apply-templates\/>\
  7. <\/xsl:template>/;$ a\
  8. \
  9. </xsl:stylesheet>\

然后这样运行它:

  1. grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita | sort | uniq | sed -f xslt.sed