在博問中看見兩個比較典型的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 ...