2012-12-27 85 views
2

結束每一行的我在它與列表的文本文件:添加軟墊遞增編號在VIM

dateformatfile.ext 
dateformatfile.ext 
dateformatfile.ext 
... 

我需要一個軟墊號碼添加到每個月底,像這樣:

dateformatfile.ext 00001 
dateformatfile.ext 00002 
dateformatfile.ext 00003 
... 

有很多,所以我需要有一個命令來做到這一點。

在此先感謝。

回答

6

假設你想在你的文件中的每一行做到這一點,你可以用這樣的行號:

:execute "% normal A \<C-R>=printf(\"%05d\", line(\".\"))\<CR>" 

其中

  • execute(...)運行字符串命令
  • % normal在文件的每一行上運行正常命令
  • A附加到行
  • <C-R>=插入一個命令
  • printf("%05d", ...)格式化所述第二參數作爲五位數字
  • line(".")的結果獲取當前行的
  • <CR>數完成<C-R>=插入
+0

謝謝馬修,完美的工作。我希望我能拿出那樣的東西。也感謝其他答案,我相信他們都可以工作。 – j0nr

+0

太棒了,我很高興它爲你工作。我一直在使用Vim每天使用15年,我仍然在學習如何使用它:-) –

0

人們可以使用awk很容易做到這一點。 NR variable gives you the record number,並記錄映射到行,除非重新定義RS變量。所以如下:

awk -e '{ print $0 NR }' filename應該做的伎倆。填充它們是留給讀者的練習。

0

我會這樣做使用宏(我喜歡宏:D)。

首先,讓我們來處理這些數字(我們稍後再填充它們)。 手動添加第一行末尾的數字1。 然後在第一線記錄本宏:

qq  - record the macro q 
$   - go at the end of the line 
F<space> - go backward to the last space 
"ay$  - copy till the end of the line in the buffer a 
j$  - go at the end of the line below 
"ap  - copy the buffer content 
<ctrl+A> - increment the number 
q   - stop recording the macro 

現在你可以用1000 @ q應用它一堆倍(將在該文件的末尾停止)。

這不是很漂亮,但它的工作。

對於填充,我會使用另一個醜陋的技巧。首先,使用正則表達式匹配3位數字並在之前添加0,然後使用2位數字(此時添加兩個0)來執行相同的操作,依次類推...

vim宏很醜,但它們很有用對我來說,當我厭倦寫一個指紋時(我應該學習awk)。此外,它們可以幫助您記住一些晦澀難懂的vim快捷方式。

1

如果您的文本塊位於文件的開頭。這意味着要追加「00001」該行是文件的第一行,試試這個命令,我只是簡單地檢查與ext結束行了,你可以把它是否需要將其更改爲正確的正則表達式:

:%s/ext$/\="ext ".printf("%05d", line("."))/g 

如果文本塊不在文件的開頭。你剛纔檢查第一線的塊,並得到行號(要追加00001行),例如,行數5:

:let b=5|%s/ext$/\="ext ".printf("%05d", line(".")-b+1)/g 
1

這是我服用。

將光標定位在要添加第一個數字的第一行上。
:let i=0定義一個變量來保存計數。
qm開始將宏記錄到寄存器m
A <C-R>=printf("%05d", i)<CR><ESC>添加一個空格和printf的輸出。
:let i+=1遞增下一次宏執行的計數。
q結束宏的記錄。

jVG可視化選擇我們想要添加數字的文檔的其餘部分。
:normal @m執行宏以將數字添加到選定的行。

我認爲這種做法有一定的優勢:

  • 沒有醜陋的逃避必要的。
  • 計數不與行號綁定。允許偏移。
  • 使用宏可以很容易地與:global命令組合使用。例如:

:g/ext$/ normal @m執行宏存儲在在分機結束行寄存器

0

如果您的環境中有PERL,則可以在VIM會話中單行運行PERL。

:%! perl -pe " $count++ ; s/$/$count/" 

需要注意的是,您可能必須在perl腳本週圍使用雙引號。在我的PC上,如果我使用單引號,PERL將運行。但我無法用美元符號來解決變數。