Linux?CentOS7?vim重復(fù)行問題
在用vim編輯處理文件時,會有重復(fù)行。有的是情境需要,有的可能是誤操作而形成。對于正常形成的重復(fù)行,我們不作討論,我們僅討論什么情況下會出現(xiàn)重復(fù)行,如何避免,如何處理。
在文件中的單行或多個連續(xù)空白行,我們不作處理。這可能是格式需要。
一、出現(xiàn)重復(fù)行
1.現(xiàn)象
很多新手容易出現(xiàn)的現(xiàn)象:編輯vim后出現(xiàn)很多重復(fù)行
2.原因
原因也很簡單,vim具有數(shù)字+命令的多次重復(fù)執(zhí)行命令的功能,也就是說,允許數(shù)字+命令的語法格式,表示重復(fù)執(zhí)行命令,其重復(fù)次數(shù)就是命令前的數(shù)字。
如在命令模式下,5yy:從光標(biāo)所在行開始且包括當(dāng)前行,共復(fù)制5行;3dd:從光標(biāo)所在行開始(含當(dāng)前行),共刪除3行;7p:在光標(biāo)所在行后粘貼7次前面復(fù)制的內(nèi)容。
新手是如何操作,才造成的重復(fù)行呢?
新手操作vim最容易犯的錯誤就是用vim打開文件就開始錄入內(nèi)容。不顯示內(nèi)容時就用鼠標(biāo)點點點。
當(dāng)錄入某些數(shù)字后,發(fā)現(xiàn)沒有模式切換,就又按了i/I,或按了a/A。在編輯模式下,錄入一些內(nèi)容后,按Esc鍵返回命令模式。這時就會出現(xiàn)重復(fù)的多行內(nèi)容(就是前面錄入的內(nèi)容)。
3.案例
我們對此過程進(jìn)行模擬操作,重現(xiàn)此類現(xiàn)象。
a.打開文件
我們先準(zhǔn)備一個文本文件test.txt:
b.錄入數(shù)字
用vim test.txt打開文件,(在命令模式下)直接錄入數(shù)字123(可以是小鍵盤錄入,也可以是主鍵盤上的123,不影響后續(xù)結(jié)果)。
c.切換模式
再按i鍵,進(jìn)入編輯模式
d.錄入內(nèi)容
移動光標(biāo),在abcde行下錄入ABCD,按回車
e.退出
按Esc,退出編輯模式,vim的文本內(nèi)容將出現(xiàn)如下效果:
文件中的其他部分內(nèi)容不變!錄入的內(nèi)容本來希望一行“ABCD”,現(xiàn)在出現(xiàn)很多行(123行)。
二、避免重復(fù)行
1.知道原因
了解vim模式的使用,在不同模式下操作不同的命令或內(nèi)容。
如果因操作不當(dāng),產(chǎn)生了重復(fù)行,可以返回到命令模式下,按u取消原來的操作。
2.操作注意
不在命令模式下錄入數(shù)字,或錄入數(shù)字后及時按Esc,取消剛才的操作。
如確實需要部分內(nèi)容重復(fù),可以按此方法,產(chǎn)生需要的重復(fù)行。
三、刪除重復(fù)行
刪除重復(fù)行的操作十分普遍。
如果找不到產(chǎn)生重復(fù)行的原因,或拷貝內(nèi)容時產(chǎn)生了多余的重復(fù)行,將如何刪除重復(fù)行呢?
vim刪除重復(fù)行方法很多,原理基本相同:先排序,再應(yīng)用正則表達(dá)式查找相同行,并刪除(特定條件下,不排序,直接去除重復(fù)行)。
在后續(xù)的討論中,我們需要一些重復(fù)行,將按前述介紹操作產(chǎn)生重復(fù)行。
1.sort u
sort命令應(yīng)用比較多,具有排序功能。u是uniq去除重復(fù)命令的簡寫。
: sort u
命令執(zhí)行后效果:
此命令也可以再簡化為sor[t] u,執(zhí)行時可以不寫t。
2.%!uniq
在前面刪除重復(fù)行操作后,可以在命令模式下,按u,返回到有重復(fù)行狀態(tài)。
錄入命令:
: %!uniq
效果如前,去除了重復(fù)行,僅保留一行內(nèi)容。
3.w !uniq > %
再次按下u,返回到有重復(fù)行狀態(tài)。
執(zhí)行命令(底行模式下):
: w !uniq > %
執(zhí)行命令后,有兩項選擇,如下:
選擇 O,確認(rèn)后,仍需按確認(rèn)鍵繼續(xù)。
返回原來狀態(tài)。
選擇 L,確認(rèn)后,仍需按確認(rèn)鍵繼續(xù),最終是刪除重復(fù)行:
4. sor ur /^/
再次按下u,返回到有重復(fù)行狀態(tài)。
執(zhí)行命令(底行模式下):
: sor ur /^/
效果與前面基本一致。最大的不同,是在去除重復(fù)行的同時,不打亂原來文件內(nèi)容。
在前面的命令中,不加/^/時,也可以排序、去重。但加上/^/將僅去重,不進(jìn)行打亂文件內(nèi)容而排序。
如把命令修改為sor u /^/,結(jié)果也將是排序、去重。
5.g/^\(.\+\)$\n\1/d
再次按下u,返回到有重復(fù)行狀態(tài)。
執(zhí)行命令(底行模式下):
: g/^\(.\+\)$\n\1/d
命令解釋
在命令g/^\(.\+\)$\n\1/d中:
- g全局
- ^行首
- .\+此處有1到多個任意字符
- \(\)用括號包起來形成第一個分組
- $行尾
- \n換行
- \1反向引用第一個分組
- /d刪除
本案例中,沒有執(zhí)行排序命令,直接執(zhí)行去重命令:
下面使用替換來刪除所有重復(fù)行(僅保留第一行,同時刪除后面的重復(fù)行)。這是該g//d方法的一種變體。
: %s/^\(.*\)\(\n\1\)\+$/\1/
去除重復(fù)行,僅保留一行!
: %s/\v^(.*)(\n\1)+$/\1/
去除重復(fù)行,僅保留一行!
: %s/\(.\+\)$\n\1/\1/g
不能一次去除重復(fù)行,可以多次執(zhí)行,最后只保留一行。
另外還有一些別的命令,也可以試一試:
:g/\%(^\1$\n\)\@<=\(.*\)$/d
//功能同上,也是去除重復(fù)行:g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d
//功能同上,也是去除重復(fù)行
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux文件系統(tǒng)調(diào)整大小的方法(linux調(diào)整分區(qū)大小)
本文歸納了在不破快文件系統(tǒng)數(shù)據(jù)的前提下對文件系統(tǒng)大小進(jìn)行調(diào)整的方法.這里采用的是"拆東墻, 補西墻"的方法, 當(dāng)然, 如果你的磁盤中有未分區(qū)的空閑空間, 你就不用減小某個分區(qū)的空間了2014-01-01CentOS 6.4系統(tǒng)下編譯安裝LNMP和配置PHP環(huán)境具體步驟
下面介紹的是CentOS 6.4系統(tǒng)下編譯安裝LNMP和配置PHP環(huán)境具體步驟,感興趣的朋友可以參考下,希望對你配置php環(huán)境有所幫助2013-05-05linux設(shè)置服務(wù)開機(jī)自啟動的三種方式
這篇文章主要介紹了linux設(shè)置服務(wù)開機(jī)自啟動的三種方式,需要的朋友可以參考下2015-11-11記一次入侵Linux服務(wù)器和刪除木馬程序的經(jīng)歷
這篇文章主要介紹了記一次入侵Linux服務(wù)器和刪除木馬程序的經(jīng)歷的相關(guān)資料,需要的朋友可以參考下2016-02-02