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我的文件.
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...(我在上面添加了这些).