84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
需求如下:
輸入檔案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++已經實現了,現在就是想知道能不能用正規表示式實作)
人生最曼妙的风景,竟是内心的淡定与从容!
%s/\v((.).*\n)((.*\n)+)(.*$)//g
((.).*n) 匹配第一行,外層分組用於替換的時候反向引用,內層分組用於後面判斷
((2.*n)+) 符合接下來 以上一行第一個字母開頭的行(1行或多行)
(2.*$) 符合一行以第一行第一個字母開頭的行
最後 15 把上面符合的所有的行 替換成第一行和最後一行,即刪除中間的行
註:最開始的v是切換到perl正規模式,這樣括號、加號就不需要轉義了
BTW 這種文字處理的工作用perl腳本完成是最方便的,vi的好處是可視化調試,但是遇到大文件就GG了
vim的正規
分成三段解釋一下
((.).*n)
匹配第一行,外層分組用於替換的時候反向引用,內層分組用於後面判斷
((2.*n)+)
符合接下來 以上一行第一個字母開頭的行(1行或多行)
(2.*$)
符合一行以第一行第一個字母開頭的行
最後 15 把上面符合的所有的行 替換成第一行和最後一行,即刪除中間的行
註:最開始的v是切換到perl正規模式,這樣括號、加號就不需要轉義了
BTW 這種文字處理的工作用perl腳本完成是最方便的,vi的好處是可視化調試,但是遇到大文件就GG了