Vim案例兩則

2021-09-06 08:54:18 字數 1869 閱讀 2375

在博問中看見兩個比較典型的vim處理文字的案例,總結一下,希望對大家有所幫助。如果大家有好的方法,歡迎討論。尤其是第二個案例,如果能夠乙個命令處理更好。

這是在博問中看到的乙個問題,原始文字如下。

要求處理成下面的樣子,也就是把逗號從行尾移動到下一行第乙個單詞前面。

我的第一想法是先將2-6行的逗號刪除,然後在3-7行加上逗號即可。

刪除2-6行的逗號

:%s/,//

解釋一下:

在3-7行前面加上逗號

:3,7s/\解釋一下:

這樣就搞定了,但是轉頭一想,有沒有更簡單的辦法呢?上面的辦法雖然也很簡單,但是需要兩次命令才能完成,有沒有辦法用乙個命令搞定呢。搞了一會,終於搞定,命令如下。

:%s/,\n\(\s*\)/\r\1,/

解釋一下:

注意,上面的(和)屬於特殊字元,需要轉義,如果覺得\(\)這種方式難看,可以在表示式前面加上\v。如此則特殊字元無需再轉義,可以像perl一樣使用正規表示式了。

:%s/\v,\n(\s*)/\r\1,/g
也來來自於博問,要求將只包含5個字元(字母,數字,或者下劃線)的行,刪除其行尾的換行符。

原始文字如下:

處理之後如下:可見2,3,4行的換行符都被刪除了。

我首先想到的命令是

:g/\v^\w$/ s/\n//

g

解釋一下:

整個表示式可以分成兩個主要部分。:g/\v^\w$/設為a,s/\n//g設為b。那麼這個命令的含義就是對於滿足條件a的行,執行命令b。也就是對於所有只包含5個字元的行,刪除其行尾的換行符。

但是非常遺憾的是,執行完這個命令後,結果並不正確,如下:

可以看到,第二個abcde末尾的換行並沒有刪除掉,為什麼會這樣呢?仔細分析一下這個命令的執行步驟。

首先vim解析命令然後找到第乙個滿足條件的行abcde,並刪除其末尾的換行符,此時文字變成下面的樣子。

這時,第二行文字是abcdeabcde,共10個字元,已經不再滿足5個字元的條件了,所以vim不會再刪除其末尾的換行了,因而就產生了上面的錯誤結果。

看來用乙個命令處理有點困難,那就分成兩個吧。雖然麻煩一點,但是結果正確。

首先把要處理的行加上乙個特殊標誌,這個標誌能夠將待處理的行與其它行區別開來,所以要選擇未在文字中出現的字元。另外乙個要求是處理完之後這個標誌也要刪除,所以把它加在行尾,可以與換行符一併刪除。

先在包含5個字元的行末尾加上#

:%s/\v(^\w$)/\1#/g
刪除所有的#和換行符。

:%s/#\n//

g

由於這次不再以字元個數來甄別處理的行,而是以#號來定位,即使兩行合併之後,#號仍然存在,結果自然就正確了。你有更簡單的辦法麼?

關於跨行匹配,下面這個網頁上有詳細的介紹。

vim, search across multiplelines

Vim案例兩則

在博問中看見兩個比較典型的vim處理文字的案例,總結一下,希望對大家有所幫助。如果大家有好的方法,歡迎討論。尤其是第二個案例,如果能夠乙個命令處理更好。這是在博問中看到的乙個問題,原始文字如下。要求處理成下面的樣子,也就是把逗號從行尾移動到下一行第乙個單詞前面。我的第一想法是先將 行的逗號刪除,然後...

Vim案例兩則

在博問中看見兩個比較典型的vim處理文字的案例,總結一下,希望對大家有所幫助。如果大家有好的方法,歡迎討論。尤其是第二個案例,如果能夠乙個命令處理更好。這是在博問中看到的乙個問題,原始文字如下。要求處理成下面的樣子,也就是把逗號從行尾移動到下一行第乙個單詞前面。我的第一想法是先將 行的逗號刪除,然後...

PL SQL經驗兩則

兩則pl sql程式設計的小經驗,隨手記下。一 對游標引數使用like查詢 定義乙個游標 cursor cemploye cpname varchar2 is select emp no from employe where name cpname 如果要使用like查詢怎麼辦?簡單 cursor ...