专栏首页生信宝典不用Linux也可以的强大文本处理方法

不用Linux也可以的强大文本处理方法

标题党了,其实是论VIM的使用

做生物信息分析最合适的还是Linux操作系统,所以生信宝典在最开始就推出了Linux学习系列,由浅入深的讲述了Linux学习中的关键点。

主要文章列举如下:

但有时也需要在Windows下做一些操作,可能是Linux当前不可用,也可能不值得折腾。

实现Linux下复杂而又简便的操作,VIM配合正则表达式是一个合适的选择。

VIM是一款功能强大的文本编辑工具,也是我在LinuxWindows下编辑程序和文本最常用的工具。

初识VIM

VIM分多种状态模式,写入模式,正常模式,可视化模式。

  • 正常模式:打开或新建文件默认在正常模式,可以浏览,但不可以写入内容。这个模式也可以称作命令行模式,这个模式下可以使用VIM强大的命令行和快捷键功能。其它模式下按ESC就可以到正常模式。
  • 写入模式:在正常模式下按字母i (光标前插入), o (当前光标的下一行操作), O (当前光标的上一行操作),a (光标后插入)都可以进入写入模式,就可以输入内容了。
  • 可视化模式:通常用于选择特定的内容。

进入写入模式后,VIM使用起来可以跟记事本一样了。在写入文字时,可以利用组合键CTRL+nCTRL+p完成写作单词的自动匹配补全,从而加快输入速度,保证输入的前后一致。

正常模式有更强大的快捷键编辑功能,把手从鼠标上解放出来。

  • dd: 删除一行
  • 3dd: 删除一行
  • dw: 删除一个单词
  • d3w: 删除3个单词
  • yy: 复制一行
  • 3yy: 复制三行
  • yw: 复制一个单词
  • p: (小写p)粘贴到下一行
  • P: (大写P)粘贴到上一行
  • >>: 当前行右缩进一个TAB
  • 3>>: 当前行及后2行都向右缩进一个TAB
  • <<: 当前行左缩进一个TAB
  • 3<<: 当前行及后2行都向左缩进一个TAB
  • /word: 查找特定单词
  • u: 撤销上一次操作
  • .: 重复上一次操作
  • CTRL+r: 重做撤销的操作
  • y$: 从当前复制到行尾
  • d$: 从当前删除到行尾

跳转操作

  • gg: 跳到文件开头
  • G: 跳到文件结尾
  • zt: 当前行作为可视屏幕的第一行
  • 5G: 跳到第5行

正常模式下输入冒号进入更强大的命令行定制功能。

  • :5d: 删除第5行
  • :20,24y:复制20到24行
  • :.,+3y:复制当前行和下面3行
  • :2,11>: 右缩进
  • :w: 保存文件
  • :q: 退出编辑器
  • :vsplit: 分屏

键盘操作不容易被捕获,看右下角可以得到一点信息。

ttp://blog.genesino.com/images/vim/vim_basic_operation.gif (公众号传个GIF总失败,也不提示失败原因,请大家移步原文或自己点击查看gif了)

VIM还有不少魔性操作,具体可以看这两个帖子:

  • http://coolshell.cn/articles/5426.html
  • http://coolshell.cn/articles/11312.html

VIM中使用正则表达式

这儿以提取生信宝典公众号中发过的原创文章的HTML代码为例子,获得原创文章的名字和链接,用以制作文章列表。

部分数据如下所示,利用正则表达式的第一步就是找规律。

  • 这段文字是JSON格式,列表和字典的组合,使用json函数可以很容易解析。但我们这通过正则表达式解析。
  • title后面跟随的文章的题目; url后面跟随的是文章的链接。
  • {""}标记每篇文章的信息的开始和结束。
  • auth_apply_num是目前不关注的信息。

下面的动画(点击原文看动画,上传总失败)展示了如何通过正则表达式,把这段文字只保留题目和链接,并转成Markdown的格式。

  • :set wrap: 折行显示
  • :s/"}, {"/\r/g: :开启命令行模式;s: 是替换,之前讲Linux命令时也多次提及;/作为分割符,三个一起出现,前两个/中的内容为被替换内容,后两个/中的内容为替换成的内容;这里没有使用正则表达式,直接是原字符的替换,\r表示换行符。这样把每篇文章的信息单行显示,方便后续处理。
  • :%s/auth_apply.*"title":"/[/%表示对所有行进行操作;被替换的内容是auth_applytitle":"及其之间的内容(.*表示,.表示任意字符,*表示其前面的字符出现任意次)
  • :%s/".*"url":"/](/:从题目到url之间的内容替换掉;第一次替换时忘记了第一行中开头还有引号,结果出现了误操作,后面又退回去,手动删除特殊部分,其它部分继续匹配。
  • :%s/$/)/:表示在行尾($)加上), 就组成了Markdown中完整的链接形式[context](link)
  • :%s/^/* /:表示在行首(^)加上*变成Markdown格式的列表

至此就完成了生信宝典公众号文章到Markdown链接的转换,可以放到菜单栏文章集锦里面方便快速查询了。

一步步的处理也有些麻烦,有没有办法更简单些呢?(原文看动画)

  • 首先也是把每篇文章的信息处理为单行显示,一样的模式更容易操作,去掉第一行行首不一致的部分
  • 使用上下箭头可以回溯之前的命令,类似于Linux终端下的操作
  • %s/.*title":"\([^"]*\).*url":"\(.*\)/* [\1](\2)/c: 这个是记忆匹配,记录下匹配的内容用于替换,\(\)表示记忆匹配的开始和结束,自身不匹配任何字符,只做标记使用;从左只右, 第一个\(中的内容记录为\1, 第二个\(中的内容记录为\2,以此类推。尤其在存在括号嵌套的情况下,注意匹配位置,左括号出现的顺序为准。在匹配文章题目时使用了[^"]*而不是.*,是考虑到正则表达式的匹配是贪婪的,会囊括更多的内容进来,就有可能出现非预期情况,所以做这么个限定,匹配所有非"内容。

正则表达式在数据分析中有很多灵活的应用,可以解决复杂的字符串抽提工作。常用的程序语言或命令如pytho, R, grep, awk, sed都支持正则表达式操作,语法也大体相似。进一步学习可参考一下链接:

  • VIM正则表达式 http://blog.csdn.net/u014015972/article/details/50688837
  • Pyton正则表达式 https://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

本文分享自微信公众号 - 生信宝典(Bio_data),作者:陈同

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python文学化编程 - Jupyter notebook使用和插件拓展

    Jupyter notebook (Ipython notebook)是集代码、结果、文档三位一体的文学化可重复程序文档。支持40多种程序语言,Python为原...

    生信宝典
  • 赠你一只金色的眼 - 富集分析和表达数据可视化

    GOplot包用于生物数据的可视化。更确切地说,该包将表达数据与功能分析的结果整合并进行可视化。但是要注意该包不能用于执行这些分析,只能把分析结果进行可视化。在...

    生信宝典
  • Science: 小鼠肾脏单细胞转录组+突变分析揭示肾病潜在的细胞靶标

    昨天Science文章背靠背揭示癌症中细胞感应氧气的新机制一文从表观水平分析了细胞中组蛋白修饰如何感知环境变化而发生不同的调控机制。

    生信宝典
  • 用Scala实现一个简单的双向队列

    对列表的任何操作不会影响本身的列表,列表一旦创建便不会发生改变,这会使得我们更好的推导数据的变化。作为一门Scalable的语言,Scala允许使用者也可以开发...

    哒呵呵
  • 常用HTTP状态码简介

    常用HTTP状态码简介 一些常见的状态代码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务器暂时不可用

    云知识Online
  • HTTP状态码查询

    如果客户端向服务器发出了某项请求要求显示网站上的某个网页,那么,服务器会返回 HTTP 状态代码以响应该请求。 一些常见的状态代码为: 200 - 服务器...

    joshua317
  • HTTP协议状态码

    程序员同行者
  • 深入理解《单例模式》之源码分析

    执行这段代码会发现o1<>o2,这就破坏了单例。 为什么呢?罪魁祸首就是如下代码,它是反射的newInstance()的底层实现。

    本人秃顶程序员
  • 经典面试题-Http协议中返回状态200、404、302、301、500、502各式什么含义

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • 详解HTTP/1.0、HTTP/1.1、HTTP/2、HTTPS

    当我们在浏览器中输入一个地址,按下回车后,浏览器获取到的是一个字符串。浏览器此时要对这个地址进行解析,获取协议,主机,端口,路径等信息。

    小东啊

扫码关注云+社区

领取腾讯云代金券