Bash 脚本 VIM 命令

Bash 脚本 VIM 命令

我有一些文件需要应用一组烦人的重复 VIM 命令。它们是基本的 VIM 命令,只是为了删除我需要文件的进程不支持的一些行。

假设我有一个名为 postgresdb.out 的文件

在这个文件上我将

vim ./postgresdb.out

然后从 VIM 内部我会

:%s/old/new/g

进而

:g/deletethis/d

其次是

:%s/\n\n//g

然后保存文件并开始我的一天

我想知道是否可以编写一个 bash 脚本来执行此过程,而不是一直重新输入

答案1

备择方案

除非你真的需要特殊的 Vim 功能,否则最好使用非交互式工具例如sed,,awk或 Perl / Python / Ruby /你最喜欢的脚本语言在这里

也就是说,您可以非交互方式使用 Vim:

静默批处理模式

对于非常简单的文本处理(即像增强的“sed”或“awk”一样使用 Vim,可能只是受益于命令中的增强正则表达式:substitute),使用前模式

REM Windows
call vim -N -u NONE -n -i NONE -es -S "commands.ex" "filespec"

注意:静默批处理模式 ( :help -s-ex) 会弄乱 Windows 控制台,因此您可能需要cls在 Vim 运行后进行清理。

# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"

"commands.ex"注意:如果文件不存在,Vim 将挂起等待输入;最好事先检查它是否存在!或者,Vim 可以从 stdin 读取命令。您还可以使用从 stdin 读取的文本填充新缓冲区,如果使用参数,则可以从 stderr 读取命令-

全自动化

对于涉及多个窗口的更高级处理以及 Vim 的真正自动化(您可以与用户交互或让 Vim 保持运行以让用户接管),请使用:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

以下是所使用参数的摘要:

-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-i NONE           Ignore the |viminfo| file (to avoid disturbing the
                user's settings).
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                with messages or output to avoid blocking.

答案2

自动编辑应该使用sed(1)(参见man sed

您正在寻找的推荐是

 sed -i -e s/old/new/g -e /deletethis/d -e '/^$/d' postgresdb.out

我不确定您的期望是什么:%s/\n\n//d

在哪里

  • -i意味着就地编辑(通常 sed 将输出版本做标准输出)
  • -e...进行编辑/删除
  • -e '/^$/d'应该删除空行

相关内容