不用Linux也可以的强大文本处理方法
標題黨了,其實是論VIM的使用。
做生物信息分析最合適的還是Linux操作系統,所以生信寶典在最開始就推出了Linux學習系列,由淺入深的講述了Linux學習中的關鍵點。
主要文章列舉如下:
- Linux學習-文件和目錄
- Linux學習-文件操作
- Linux文件內容操作
- Linux學習-環境變量和可執行屬性
- Linux學習 - 管道、標準輸入輸出
- Linux學習 - 命令運行監測和軟件安裝
- Linux學習-常見錯誤和快捷操作
- Linux學習-文件列太多,很難識別想要的信息在哪列;別焦急,看這里。
- [Linux學習-文件排序和FASTA文件操作](http://mp.weixin.qq.com/s?__biz=MzI5MTcwNjA4NQ==&mid=2247483823&idx=1&sn=ac62450f0475dc9513e75009f0670f45&chksm=ec0dc425db7a4
d3300f547caeaee709425dd0a41c86be18aab44d41619a4d18944289b0deaf8#rd”}) - [用了Docker,媽媽再也不擔心我的軟件安裝了 - 基礎篇](http://mp.weixin.qq.com/s?__biz=MzI5MTcwNjA4NQ==&mid=2247483840&idx=1&sn=f87f6dd703cd8c109f6dc5b8d12ffb7c&chk
sm=ec0dc44adb7a4d5c9ff2422c730b1d7bb18dcb6947c0e7449f1678aee492c3193302174930b4#rd) - [Linux服務器數據定期同步和備份方式](http://mp.weixin.qq.com/s?__biz=MzI5MTcwNjA4NQ==&mid=2247483950&idx=1&sn=6f4dbc46a064638d7c95b9f99cb1de70&chksm=ec0dc7a4db7a4
eb20751dd6567b1c97be7d536671af07707eb57bb1ea7865cbde17a0226a6e0#rd)
但有時也需要在Windows下做一些操作,可能是Linux當前不可用,也可能不值得折騰。
實現Linux下復雜而又簡便的操作,VIM配合正則表達式是一個合適的選擇。
VIM是一款功能強大的文本編輯工具,也是我在Linux,Windows下編輯程序和文本最常用的工具。
初識VIM
VIM分多種狀態模式,寫入模式,正常模式,可視化模式。
- 正常模式:打開或新建文件默認在正常模式,可以瀏覽,但不可以寫入內容。這個模式也可以稱作命令行模式,這個模式下可以使用VIM強大的命令行和快捷鍵功能。其它模式下按ESC就可以到正常模式。
- 寫入模式:在正常模式下按字母i (光標前插入), o (當前光標的下一行操作), O (當前光標的上一行操作),a (光標后插入)都可以進入寫入模式,就可以輸入內容了。
- 可視化模式:通常用于選擇特定的內容。
進入寫入模式后,VIM使用起來可以跟記事本一樣了。在寫入文字時,可以利用組合鍵CTRL+n和CTRL+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: 分屏
鍵盤操作不容易被捕獲,看右下角可以得到一點信息。
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_apply和title":"及其之間的內容(.*表示,.表示任意字符,*表示其前面的字符出現任意次)
- :%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
招聘
- 易漢博歡迎您加入
聯系我們
2
總結
以上是生活随笔為你收集整理的不用Linux也可以的强大文本处理方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在MacBook连接鼠标时,停用内置
- 下一篇: 这是一个非常不错的mkv编辑制作的软件!