Vim|Vim 统计行内特定字符次数,按奇偶替换

今天遇到一个问题,要统计一个文本行内特定字符的出现次数,同时按照奇数次替换,比如:

"aaa"aaad"aaaa"
"aaaa"
"aaaa
"aaaa"aaaa"aaa
"aaaaa"aaaa"aaaa"aaaa"aaaa"
"aaa"aaaaa
得到如下内容:
``aaa"aaad``aaaa"
``aaaa"
``aaaa"
``aaaa"aaaa``aaa"
``aaaaa"aaaa``aaaa"aaaa``aaaa"
``aaa"aaaaa
操作步骤如下:
:let n=0 | g/"/if(count(getline('.'),'"') % 2 != 0) | s/^ /ok / | endif | let n+=1

  1. let n=0
  2. g/"/
  3. if(...) | ... | endif
  4. count(range, char) 统计range里面char的数量
  5. getline('.') 获得当前行内容
总体翻译过来就是如果“出现次数为奇数,将其行首添加一个ok+空格,这样标记完成后,我们来到有ok的行,处理相应的引号。
【Vim|Vim 统计行内特定字符次数,按奇偶替换】接着,我们进行奇偶替换:
:let a = ['"', '``'] :%s/"/\=reverse(a)[0]/g

  1. a['...', '...'] 设置一个数组
  2. \=CMD 返回CMD的结果
  3. reverse(a)[0] 数组首尾值交换
    解释一下:
    遇到第一个引号反转数组,返回数组第0项,遇到第二个引号,反转数组,这样数组返回到初始状态,取第一项,如此反复,由于引号总数是偶数,那么奇数次的引号总会被替换成``,偶数次则保留原样。

    推荐阅读