我有许多文件,我想删除其中的第1行到第55行,在第25行到第35行添加注解引导符(例如,//),然后将更改保存到新文件中。我如何单独使用Vim或在Bash脚本的帮助下自动完成此操作?
//
qvk1mo1f1#
尽管在这种情况下使用ed或sed是一种常见的做法 ,但有时使用Vim更方便。实际上,与其盲目地编写类似ed的脚本,不如先在Vim中以交互方式对其中一个文件执行所需的操作:
ed
sed
vim -w log.vim file1.txt
然后对其余文件重复此操作:
for f in file*.txt; do vim -s log.vim "$f"; done
对于您的示例用例,log.vim文件的内容可能类似于以下内容:
log.vim
gg55dd:25,35s/^/\/\/ / :w %_new :q!
请注意,要用新名称保存文件,您不应该直接键入它,而是使用%替换,如上所示否则后续文件的所有修改都将保存到同一个文件中,每次都会覆盖其内容。或者,您可以预先复制文件,然后在适当的位置编辑副本(只需发出不带参数的:w命令即可保存每个副本)。这种方法的优点是,您可以交互式地进行所有更改,确保在对其余文件执行编辑之前,至少在其中一个文件上获得预期的结果。
%
:w
¹当然,你也可以以类似ed的方式使用Vim:
for f in file*.txt; do vim -c '1,55d|25,35s/^/\/\/ /|w!%_new|q!' "$f"; done
o2g1uqev2#
您可以使用ed(unix行编辑器,vi的前身)优雅地完成此操作。
fix_file () { ed -s "$1" <<-'EOF' 1,55d 25,35s_.*_// &_ wq EOF }
现在,对于您需要的每个文件F,只需执行fix_file F。
fix_file F
2条答案
按热度按时间qvk1mo1f1#
尽管在这种情况下使用
ed
或sed
是一种常见的做法 ,但有时使用Vim更方便。实际上,与其盲目地编写类似ed
的脚本,不如先在Vim中以交互方式对其中一个文件执行所需的操作:然后对其余文件重复此操作:
对于您的示例用例,
log.vim
文件的内容可能类似于以下内容:请注意,要用新名称保存文件,您不应该直接键入它,而是使用
%
替换,如上所示否则后续文件的所有修改都将保存到同一个文件中,每次都会覆盖其内容。或者,您可以预先复制文件,然后在适当的位置编辑副本(只需发出不带参数的:w
命令即可保存每个副本)。这种方法的优点是,您可以交互式地进行所有更改,确保在对其余文件执行编辑之前,至少在其中一个文件上获得预期的结果。
¹当然,你也可以以类似
ed
的方式使用Vim:o2g1uqev2#
您可以使用ed(unix行编辑器,vi的前身)优雅地完成此操作。
现在,对于您需要的每个文件F,只需执行
fix_file F
。