搜尋

首頁  >  問答  >  主體

vim - 一個用vi/shell使用正規表示式進行文字處理的問題

需求如下:

輸入檔案input.txt:
a1
a2
a3
a4
b1
b2
a5
b3
b4
b5

要求輸出檔output.txt為:
a1
a4
b1
b2
a5
b3
b5

即去掉第N行,N滿足的條件是:第N行與第N-1、第N+1行的首字母都相同(不去掉首行與末行)。

請問使用vi的替換指令或shell能完成此需求嗎,給點提示也行,謝謝。 (我用C++已經實現了,現在就是想知道能不能用正規表示式實作)

黄舟黄舟2824 天前900

全部回覆(1)我來回復

  • 黄舟

    黄舟2017-05-16 16:44:06

    vim的正規

    %s/\v((.).*\n)((.*\n)+)(.*$)//g
    

    分成三段解釋一下

    ((.).*n)
    匹配第一行,外層分組用於替換的時候反向引用,內層分組用於後面判斷

    ((2.*n)+)
    符合接下來 以上一行第一個字母開頭的行(1行或多行)

    (2.*$)
    符合一行以第一行第一個字母開頭的行

    最後 15 把上面符合的所有的行 替換成第一行和最後一行,即刪除中間的行

    註:最開始的v是切換到perl正規模式,這樣括號、加號就不需要轉義了

    BTW 這種文字處理的工作用perl腳本完成是最方便的,vi的好處是可視化調試,但是遇到大文件就GG了

    回覆
    0
  • 取消回覆