2.7 给文本加标签
怎么让“The Rime of the Ancient Mariner”的内容以网页而不是纯文本形式显示呢?换句话说,怎么使用正则表达式而不是手写方式为它们添加HTML5标签呢?
在之后的几章中,我会陆续展示相应的方法,本章先从简单情况的开始。
点击RegExr中的Replace(替换)标签,选中multiline(多行)选项,然后在第一个文本框中键入:
(^T.*$)
这个表达式会从文件的开始匹配诗文的第一行,然后使用括号将文本捕获到一个分组中。在第二个文本框中键入:
<h1>$1<\h1>
这个替换表达式将$1捕获的内容嵌套在了h1标签中。可以在底部的文本框中看到结果。$1是一个Perl风格的后向引用。此外,在包括Perl在内的多数实现程序中,还可以使用\1表示后向引用,但是RegExr只支持$1、$2、$3这样的方式。我们会在第4章中讲解更多有关分组和后向引用的内容。
2.7.1 用sed为文本加标签
在命令行中使用sed也可以为文本添加标签。sed是Unix流编辑器,它支持用正则表达式转换文本。sed最初在20世纪70年代早期由Lee McMahon于贝尔实验室开发。如果用户使用的是Mac或者Linux,那就已经有sed了。
请在shell提示符(比如Mac中的Terminal终端窗口)中测试以下内容:
echo Hello | sed s/Hello/Goodbye/
运行的过程应该如下:
· echo命令将在标准输出设备(通常是屏幕)中打印单词Hello,竖线符(|)将打印内容通过管道传到之后的sed命令;
· 管道将echo的输出转为sed的输入;
· sed的s命令将单词Hello变为Goodbye,而Goodbye就显示在屏幕上了。
如果你的平台上还没有安装sed,可以参考本章末尾相关资源中的链接。其中还讨论了BSD和GNU两个版本的sed。
现在试着在命令或shell提示符中键入:
sed -n 's/^/<h1>;s$/<\/h1>/p;q' rime.txt
而输出就是:
<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.</h1>
以下是正则表达式处理器的工作过程解析。
· 首先调用sed程序。
· sed默认的操作是直接复制每行输入并输出,-n选项覆盖了该默认操作。之所要覆盖默认操作,是因为我们只想让正则表达式影响第1行。
· s/^/<h1>/在行的开头(^)添加<h1>标签。
· 分号(;)用于分隔命令。
· s/$/<\/h1>/在行的结尾($)添加</h1>标签。
· 命令p会打印受影响的那一行(第1行)。与-n不同,后者会打印所有行。
· 最后命令q会结束程序,这样sed程序就只会处理第1行。
· 所有的操作都是针对rime.txt文件执行的。
这行命令还有另一种写法,即用-e选项分别引导每个命令。我当然更喜欢使用带分号的写法,因为那种写法更简短。
sed -ne 's/^/<h1>/' -e 's/$/<\/h1>/p' -e 'q' rime.txt
可以将这些命令写到文件里,比如这里所示的文件h1.sed(该文件就在之前所说的代码库里):
#!/usr/bin/sed
s/^/<h1>/
s/$/<\/h1>/
q
若要运行该文件,请在与rime.txt同一个路径或文件夹里运行如下命令:
sed -f h1.sed rime.txt
2.7.2 用Perl为文本加标签
最后,我将展示如何用Perl来做类似的事。Perl是由Larry Wall于1987年创立的一种通用程序设计语言。它以对正则表达式的强大支持和文本处理能力而闻名。
在命令提示符中键入
perl –v
然后回车,看看你的系统中是否已经安装了Perl。该命令会返回系统中Perl的版本信息或者返回错误(参见2.9节)。
在命令提示符中键入:
perl -ne 'if ($. == 1) { s/^/<h1>/; s/$/<\/h1>/m; print; }' rime.txt
就可以得到和sed示例中一样的输出结果:
<h1>THE RIME OF THE ANCYENT MARINERE, IN SEVEN PARTS.</h1>
以下是这个Perl命令的执行过程解析。
· perl调用了Perl程序。
· -n选项输出全部输入内容(rime.txt文件)。
· -e选项允许在命令行(而不用在文件)中提交程序代码。
· if语句检查是否在第一行。在Perl中$.是个特殊的变量,它匹配当前行。
· 第一个替换命令s先找到第一行的开头(^)然后插入<h1>标签。
· 第二个替换命令s搜寻行结尾($)再插入</h1>标签。
· 替换命令最后的m(多行)修饰符,表示将本行单独处理;这样,$就只匹配第一行的结尾而不会匹配整个文本的结尾。
· 最后在标准输出设备(屏幕)中打印出结果。
· 所有这些操作都是针对rime.txt文件的。
同样可以将这些命令放入程序文件中,比如示例代码库中的h1.pl文件。
#!/usr/bin/perl –n
if ($. == 1) {
s/^/<h1>/;
s/$/<\/h1>/m;
print;
}
然后在rime.txt的同一个目录下,执行如下命令:
perl h1.pl rime.txt
用Perl语言实现相同任务的方式很多,也许这不是为文本添加标记的最有效的方法。很可能本书上市后,我又会想出使用Perl(或其他工具)的更有效的方法。希望你也能够想到。
下一章我们将讨论边界和零宽度断言。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论