正则表达式捕获文本

来源:互联网 发布:淘宝弹出淘口令 编辑:程序博客网 时间:2024/06/07 19:51
unix 操作文本的工具集内大多是以“行”为操作单位的,例如 grep,sort 等等。另外有一些工具如 cut 等可以将“行”中部分内容提取出来,这种操作通常叫做“捕获”。

但象 cut 这样的命令因为不支持正则表达式,只能完成很简单的捕获工作。因此能满足 LZ 需要的工具主要有 sed, awk, perl 等。其它支持正则表达式功能的脚本工具如 python 等也可以做到,但或多或少对系统环境本身有一定的要求(例如是否安装了 python 等等)。

sed 功能专一故执行速度最快,但它的正则表达式的表达能力最弱,写复杂表达式时很罗嗦。

awk 号称“万能过滤器”,正则表达式的表达能力很强。是专门用来执行过滤和捕获工作的好工具。但它相对独立,和系统的交互能力不强,因此只适合拿来处理文本。

perl 是泛用型脚本工具,LW 设计 perl 之初的目的就是拿它来替代 awk 及各类 shell 脚本工具,因此功能非常强大,相比之下正则表达式处理能力最强(应该算目前最强大的正则表达式处理工具了),但由于其书写过于灵活多变,掌握它不太容易,如果仅用来做捕获工作有点大材小用。

所以我建议 LZ 拿 awk 来解决问题。命令行:

awk -f 脚本文件名.awk 数据文件名

脚本文件名.awk 中的内容:

# 脚本开始
{
# $0 表示当前行
# match() 执行完毕后,捕获的内容由 RSTART, RLENGTH 指出
# substr 抽出 $0 中的捕获的内容,并由 print 打印
  if (match($0, /正则表达式/))
    print substr($0, RSTART, RLENGTH);
}
# 脚本结束

上述脚本内容也可直接写在命令行上:

awk '{if(match$0,/正则表达式/))print substr($0, RSTART, RLENGTH);}' 数据文件名

当然也可以采用管道方式

cat 数据文件名 | awk '{if(match$0,/正则表达式/))print substr($0, RSTART, RLENGTH);}'

希望对 LZ 有用。
0 0