您的位置:首页 > 理论基础 > 计算机网络

Vim命令小结-指定词统计和提取指定词(正则表达式)

2014-03-19 17:15 459 查看
        最近在做基于Nutch网络爬虫爬取数据及一些数据处理的内容,涉及到在网络爬虫爬取到的HTML文件中提取一些用户名,之前想的一直是导入数据库再进行操作,从而忽略了强大的Vim。
        问题来源:
        根据网络爬虫爬取了一些淘宝BBS的一些数据,dump出一些HTML文件数据,一共120多万行,如下所示:

 
       分析发现,含有用户名的具有统一的class=“ext-ellipasis”,想把如lzxxcom这样的用户全部提取出来。

      实现思路:
     1:先提取出ext-ellopsis所在的行。
     2:根据正则表达式提取所需要的用户信息。

      具体实现
     1:vim查询pattern出现的个数  
         命令:--------:%s/pattern/&/g
         解释:& 代表的意思就是用来表示前面比对的字串,所以做这个指令其实对档案本身并不会有什麽改变。但是由於做的是全域的取代置换, vim 会告诉你有从多少行中多少个字串被取代。轻轻松松很漂亮地用一行命令解决这个问题。

     


        可以看出一共找到18057个ext-ellipsis.
     2:先提取出ext-ellipsis所在的行
        用g命令轻松搞定
       :g/pattern/d 用于删除带有指定搜索内容的行。

            :g!/pattern/d 用于删除不带指定搜索内容的行。:g! 命令也有一个别名是 :v。
       使用:g!/ext-ellipsis/d  命令结果如下所示:
      


     3:根据正则表达式提取所需要的用户信息
       Vim打开文件后,使用如下正则表达式
       :%s/.*="\(.*\)" .*/\1/g

       得到如下结果
      


      其中肯定有不少的重复的
      进行以下操作
      删除重复的用户名:
      :g/^\(.*\)$\n\1$/d                                //去除重复行

           :g/\%(^\1$\n\)\@<=\(.*\)$/d               //功能同上,也是去除重复行

           :g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d   //功能同上,也是去除重复行  

      再进行排序:
      : sort                                                   //可以直接排序,这个太好用了

      得到如下结果:
      


   4:分行及E488:
Trailing characters

   原因为此特殊符号在替换中有特殊意义

   比如-----:%s///\r/g(根据/进行分行) 这样会出错,因为/有特殊含义。

          必须改为-----:%s/\//\r/g    才可以

 
      参考网站如下所示:
      http://www.oschina.net/question/347219_124969-------提取文本指定内容       http://bbs.51cto.com/thread-964013-1.html----------删除重复行
      http://edu.21cn.com/linux/g_188_793259-1.htm---------计算多少个搜寻关键词       http://www.cppblog.com/kefeng/archive/2010/10/20/130574.aspx?opt=admin-------正则表达式
     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息