需求如下:
輸入檔案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++已經實現了,現在就是想知道能不能用正規表示式實作)
黄舟2017-05-16 16:44:06
%s/\v((.).*\n)((.*\n)+)(.*$)//g
((.).*n)
匹配第一行,外層分組用於替換的時候反向引用,內層分組用於後面判斷
((2.*n)+)
符合接下來 以上一行第一個字母開頭的行(1行或多行)
(2.*$)
符合一行以第一行第一個字母開頭的行
最後 15 把上面符合的所有的行 替換成第一行和最後一行,即刪除中間的行
註:最開始的v是切換到perl正規模式,這樣括號、加號就不需要轉義了
BTW 這種文字處理的工作用perl腳本完成是最方便的,vi的好處是可視化調試,但是遇到大文件就GG了