2011-01-29 50 views
4

我有一个标记文件,其中包含[this] [],[that] [],...和[other] []等词。我知道如何在MacVim中找到这些单词,但是如何将它们替换为[this] [1],[that] [2],...和[other] [n],其中n是26案件?Vim/sed/awk使用增量整数查找并替换

如果证明比使用MacVim更简单,我还会接受使用sed或awk甚至Ruby的解决方案。

回答

2
ruby -p -e \ 
'begin t=$_.clone; $_.sub! "][]", "][#{@[email protected]_i+1}]";end until t==$_' \ 
    < somefile 

或者,在编辑的文件就地版本:

ruby -i.tmp -p -e \ 
'begin t = $_.clone; $_.sub! "][]", "][#{@[email protected]_i+1}]"; end until t == $_' \ 
somefile 
1

如果你只有做一次,也再没有,然后做它在编辑器中是罚款。当你不得不重复这么做的时候,手动完成它就成为一大难题,那就是自动化需要启动的时候。

没有包含目标文本的样本,它有点像在黑暗中拍摄,但是这似乎用接近你的描述红宝石:

text = %{ 
[Lorem][] ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
labore [et][] dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi [ut][] aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 
voluptate velit esse [cillum][] dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat 
non proident, sunt in culpa qui [officia deserunt][] mollit anim id est laborum. 
} 

text.scan(/\[[^\]]+\]\[\]/).each_with_index{ |t, i| text[t] = t.sub('[]', "[#{1 + i}]") } 
puts text 

# >> 
# >> [Lorem][1] ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
# >> labore [et][2] dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 
# >> laboris nisi [ut][3] aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in 
# >> voluptate velit esse [cillum][4] dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat 
# >> non proident, sunt in culpa qui [officia deserunt][5] mollit anim id est laborum. 
+0

如果你想自动化你在vim中做的事情,你只需要编写一个映射(或者用于更复杂任务的脚本)。这里没有痛苦,这就是为什么很多程序员喜欢vim。 – ZyX 2011-01-29 23:16:18

+0

顺便说一下,如果你在vim中这样做,你将能够轻松地撤消一些事情(即使你已经退出了编辑器)。 – ZyX 2011-01-29 23:20:19

+0

我住在vim/gvim/macvim中,在工作和家中进行了99%的编辑,但我仍然没有尝试将它用作自动化工具。 – 2011-01-30 03:35:10

1

这给一试:

awk 'BEGIN{c=1}{for(w=1;w<=NF;w++){s=sub("\\[\\]","["c"]",$w);if(s)c++};print}' inputfile 
6
perl -p -i -e 's/(\[.*?\])\[\]/"$1\[".(++$i)."]"/ge' /path/to/file 

的Vim:

:let g:lastcount=0 
:function PlusPlus() 
    let g:lastcount+=1 
    return g:lastcount 
    endfunction 
:%g/./s/\V[\.\{-}][\zs\ze]/\=PlusPlus()/g 
2

那么,在Vim中编写一个解决方案是很有可能的。我一直用这个增量器对象,而现在,这些样的东西:

--- 8 < --- VIM代码

function! Incrementor(start, step) 
    let incrementor = {} 
    let incrementor.initial_value = a:start 
    let incrementor.value = incrementor.initial_value 
    let incrementor.step = a:step 
    function incrementor.val() dict 
    return self.value 
    endfunction 
    function incrementor.next() dict 
    let self.value += self.step 
    return self.value 
    endfunction 
    function incrementor.reset() dict 
    let self.value = self.initial_value 
    return self.value 
    endfunction 
    return incrementor 
endfunction 

" With the Incrementor function above saved in, say, 
" ~/.vim/plugin/incrementor.vim, you can then create incrementors as you need 
" them and use them in substitutions, like this: 

let inc = Incrementor(0,1) 
28,$s/\v\[(\w+)\]\[\]/\="[".submatch(1)."][".inc.next()."]"/ 

finish 

" test case 

foo 
[this][] 
[that][] 
[theother][] 
bar 

复制整个代码示例说得最多的“酒吧”最后保存在一个文件中,然后保存并将其源代码(:so%)从Vim中进行测试。

0

您只需通过几个vim的命令做到这一点很容易,和宏:

/\[\]<cr>a1<esc>qqyi[np<C-a>[email protected] 

也就是说,搜索字符串“[]”,追加1号的第一个。然后开始录制一个宏。将[]中的所有内容都抽出,然后进入下一个比赛,然后粘贴。然后增加数字。停止录制,然后根据需要多次重播该宏。它会增加它每次插入的数字。