Vim中的正则与多文件搜索、批量替换

date
slug
vim-regex-search-replace
status
Published
tags
Vim
Regex
summary
最近需要处理一些 html 文件,目的说起来很简单:去掉其中的几个特定的 div。 对于 Windows 用户,多文件搜索推荐 FileLocator Pro,正则处理推荐 [RegexBuddy](http://www.cnblogs.com/Fooo/archive/2008/08/28/12787...
type
Post
最近需要处理一些 html 文件,目的说起来很简单:去掉其中的几个特定的 div。 对于 Windows 用户,多文件搜索推荐 FileLocator Pro,正则处理推荐 RegexBuddy 两个软件相对于 Vim 更加人性化。 脱离 Win 之后没有了趁手的工具,只能捡起 Vim 这个宰牛刀……

vim中的正则与常用的正则有些出入:

  • \. 匹配任意字符(不包含换行)
  • \_. 匹配任意字符(包含换行)
  • \{-} 表示懒惰模式 具体 :h regexp

以替换多行注释为例 <!-- 多行注释 -->

  1. 定位到指定目录 :cd /target/folder
  1. 打开单个文件 e: target.html
  1. 测试匹配 /<!--\_.\{-}--> 多行注释 /<!--.\{-}--> 单行注释
  1. 多文件搜索 :vimgrep /test/ **/*.html 当前目录和子目录 :vimgrep /test/ *.html 当前目录 :vimgrep /test/ subfolder/* 子目录 vimgrep 之后可以 :copen 打开 quickfix 查看匹配的列表
  1. 批量替换
  • 添加文件 :args **/*.html
  • 批量替换 :argdo %s/cha1/cha2/ | update

更多:

  • ? 匹配0或1次
  • 引用 :%s/<h\(\d\)>/head\1/g<h1><h2><h3> 替换为head1 head2 head3
  • 断言:
      1. \zs 匹配开始 /hello \zsworld 匹配hello world中的world, 其他的如my world不匹配
      1. \ze 匹配结束 /hello\ze world 匹配hello world 中的 hello, 其他的如 hello kitty 不匹配
  • /</\?h\zs\d\ze> 用来匹配 <h1></h1> <h2></h3>中的 1 1 2 3 数字
暂时就是这些。

参见:


© likaci 2013 - 2024