第10章 初级班毕业了
“Unix不会阻止用户干蠢事,因为那样也会妨碍用户做聪明的事儿。”——Doug Gwyn
恭喜你坚持到正则表达式初级班毕业。你不再是个初学者了,你已经接触了最常用的正则表达式语法。作为程序员,正则表达式会给你的工作提供更多的改善机会。
学习正则表达式为我节省了不少的时间。让我举个例子吧。
我在工作中经常要使用XSLT,经常要分析XML文件中的标签。
在上一章中我展示过一部分,但现在这里有个更长的单行命令,它从lorem.dita文件中提取一列标签名并转换为简单的XSLT样式表:
grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita | sort | uniq | sed '1 i\
<xml:stylsheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\
; s/^</\
<xsl:template match="/;s/ id=\".*\"//;s/>$/">\
<xsl:apply-templates\/>\
<\/xsl:template>/;$ a\
\
</xsl:stylesheet>\
'
我知道这个脚本看起来很复杂,但你若长期使用这些东西之后,会培养出新的思维方式。我不打算解释这个脚本执行的操作了,因为我确信你可以自己弄明白。
该脚本的输出如下:
<xml:stylsheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="body">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="li">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="p">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="title">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="topic">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="ul">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
这只是个开头。当然,要让这个简单的样式表变得有用还需要做很多编辑工作,但这样可以让你少键入很多东西。
我承认如果在文件中用以下sed命令则会更简单。事实上,我就这样做了。你可以在示例代码库中找到xslt.sed文件。下面是该文件的内容:
#!/usr/bin/sed
1 i\
<xml:stylsheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\
s/^</\
<xsl:template match="/;s/ id=\".*\"//;s/>$/">\
<xsl:apply-templates\/>\
<\/xsl:template>/;$ a\
\
</xsl:stylesheet>\
然后这样运行它:
grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita | sort | uniq | sed -f xslt.sed