使用脚本将正则表达式替换全局应用于许多文件

Law*_*den 7 regex vim scripting replace

我想将一个正则表达式替换全局应用于目录中和目录下的大约40个Javascript文件.我是一个vim的用户,但手工做这可能是乏味且容易出错,所以我想将它与脚本自动化.

我试过SED,但每次处理一个以上的线是尴尬,尤其是如果没有限制多少行的模式可能匹配.

我也试过这个脚本(在一个文件上,用于测试):

ex $1 <<EOF
gs/,\(\_\s*[\]})]\)/\1/
EOF
Run Code Online (Sandbox Code Playgroud)

图案将消除任何的Perl/Ruby的样式列表的后逗号,使"[A,B,C,]"将在次序出来为"[A,B,C]",以满足Internet Explorer中,其中单独在浏览器中,这些列表上的扼流圈.

该模式在vim中运行得非常漂亮,但如果我在ex中运行它,则根据上面的脚本无效.

谁能看到我可能会失踪的东西?

nic*_*ans 12

你问了一个脚本,但你提到你是vim用户.我倾向于在vim内部进行项目范围内的查找和替换,如下所示:

:args **/*.js | argdo %s/,\(\_\s*[\]})]\)/\1/ge | update
Run Code Online (Sandbox Code Playgroud)

这与:bufdo另一位评论者提到的解决方案非常相似,但它会使用你的args列表而不是你的buflist(因此不需要全新的vim会话,也不需要小心关闭你不想触及的缓冲区).

  • :args **/*.js - 将您的arglist设置为包含此目录和子目录中的所有.js文件
  • | - pipe是vim的命令分隔符,让我们在一行上有多个命令
  • :argdo - 对所有参数运行以下命令.它将"吞下"后续的管道
    • % - 表示整个文件的范围
    • :s - 替换命令,你已经知道了
    • :s_flags,ge- 全局(尽可能多替换每行)并抑制错误(即"不匹配")
    • |- 此管道被"吞噬" :argdo,因此以下命令每个参数也运行一次
    • :update- 喜欢:write但仅在缓冲区被修改时

这个模式显然适用于你想在多个文件上运行的任何vim命令,所以要记住它是一个方便的.例如,我喜欢用它来删除尾部空格(%s/\s\+$//),设置统一的行尾(set ff=unix)或文件编码(set filencoding=utf8)以及retab我的文件.

  • 是的,我昨天试了一下它就像一个冠军.真是太棒了!谢谢! (2认同)

too*_*php 5

1)用vim打开所有文件:

bash$ vim $(find . -name '*.js')
Run Code Online (Sandbox Code Playgroud)

2)对所有文件应用substitute命令:

:bufdo %s/,\(\_\s*[\]})]\)/\1/ge
Run Code Online (Sandbox Code Playgroud)

3)保存所有文件并退出:

:wall
:q
Run Code Online (Sandbox Code Playgroud)

我认为你需要重新检查你的搜索模式,看起来不对.我想\_\s*你应该拥有的地方\_s*.

编辑:您还应该使用命令的/ge选项:s...(我在上面添加了这些).