今天遇到一个问题,要统计一个文本行内特定字符的出现次数,同时按照奇数次替换,比如:
"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
- let n=0
- g/"/
- if(...) | ... | endif
- count(range, char) 统计range里面char的数量
- getline('.') 获得当前行内容
总体翻译过来就是如果“出现次数为奇数,将其行首添加一个ok+空格,这样标记完成后,我们来到有ok的行,处理相应的引号。
接着,我们进行奇偶替换:
:let a = ['"', '``']
:%s/"/\=reverse(a)[0]/g
- a['...', '...'] 设置一个数组
- \=CMD 返回CMD的结果
- reverse(a)[0] 数组首尾值交换
解释一下:
遇到第一个引号反转数组,返回数组第0项,遇到第二个引号,反转数组,这样数组返回到初始状态,取第一项,如此反复,由于引号总数是偶数,那么奇数次的引号总会被替换成``,偶数次则保留原样。
网友评论