2011-05-09 70 views
5

我有很多文件,我想删除第1行到第55行,然后为第25行到第35行添加注释(例如://),然后保存到新文件。几个文件的自动编辑

如何使用vim在bash shell中自动执行此操作?

+1

如果您想在不打开文件的情况下编辑文件,则需要在'bash' shell中使用'sed'。 – pavium 2011-05-09 03:14:35

+2

'ex'会比'sed'更好的匹配,'ex'使用相同的命令集'vi'。 – 2011-05-09 03:21:27

回答

3

你可以用ed这个unix行编辑器来完成这个任务,它是vi的祖先。

fix_file() { 
    ed $1 <<< EOF 
    1,55d 
    25,35s_.*_// &_ 
    wq 
    EOF 
} 

现在,对于您需要的每个文件F,只需执行fix_file F即可。

13

尽管使用edsed是一种常见的做法, 有时使用议会是方便多了。 事实上,在这种情况下 而不是写一个ed样脚本“盲目”,它更容易交互与

vim -w log.vim file1.txt 

执行文件之一的 所需的编辑,然后重复上休息的文件。

for f in file*.txt; do vim -s log.vim "$f"; done 

在你的情况log.vim文件将可能有类似这样的内容:

gg55dd:25,35s/^/\/\//
:w %_new 
:q! 

。注意,保存与新名称的文件,你不应该直接输入,但 而使用%替代。另一种方法是事先复制文件 ,然后在原地进行编辑(将每个文件保存为:w)。

此方法的优点是,您可以交互式地进行所有更改 ,确保您获得想要获得的结果。


当然,你可以做在ed样的方式相同。

for f in file*.txt; do vim -c '1,55d|25,35s/^/\/\/ /|w! '"${f}_new"'|q!' $f 

且不说它在 一个Vim解决方案是优选的问题明确说明。

+0

不要使用GUI版本(gvim),请参阅[我的问题](http://stackoverflow.com/questions/3981535/using-the-w-option-of-vim)和相关的错误。在GUI中,您必须编辑脚本。 – Benoit 2011-05-12 14:55:10

+0

@Benoit感谢您的警告!由于我从不使用GVim,所以我不太可能注意到这种行为,而知道这一点很重要。 – 2011-05-12 15:59:35