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

c9x0cxw0  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(210)

我有许多文件,我想删除其中的第1行到第55行,在第25行到第35行添加注解引导符(例如,//),然后将更改保存到新文件中。
我如何单独使用Vim或在Bash脚本的帮助下自动完成此操作?

qvk1mo1f

qvk1mo1f1#

尽管在这种情况下使用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
o2g1uqev

o2g1uqev2#

您可以使用ed(unix行编辑器,vi的前身)优雅地完成此操作。

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

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

相关问题