如何在Vim中自动编辑多个文件?

7

我有很多文件,每个文件都想要删除1到55行,给25到35行加上注释(例如//),然后保存更改到一个新文件中。

我怎样才能使用Vim自动完成这些任务呢?或者能否借助Bash脚本来实现自动化操作?


1
如果你想在不打开文件的情况下“编辑”它们,你需要在bash shell中使用sed命令。 - pavium
2
使用ex比使用sed更好,因为ex使用与vi相同的命令集。 - mu is too short
2个回答

18

尽管在这种情况下使用edsed是一种常见做法¹,但有时使用Vim更加方便。实际上,与其盲目地编写类似于ed的脚本,通常更容易首先在Vim中以交互方式执行所需的操作:

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一样使用Vim:

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

1
不要使用GUI版本(gvim)进行操作,参见我的问题和相关的错误。在GUI中,您必须编辑scriptout文件。 - Benoit
@Benoit 感谢你的提醒!由于我从未使用过GVim,所以我很难注意到这种行为,但了解这一点非常重要。 - ib.
@Benoit:我想知道,gVim中的这个bug现在修复了吗? - ib.

6
您可以使用Unix行编辑器ed来优雅地完成这个任务,它是vi的祖先。
fix_file () {
  ed -s "$1" <<-'EOF'
    1,55d
    25,35s_.*_// &_
    wq   
EOF
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接