[vim ] 保留前后字符,修改中间的字符

楼主: javafang (newJ)   2017-02-21 21:59:05
想在vim做一个功能
若文件内文是
good
help
student
school
希望可以的结果是
g__d
h__p
s_____t
s____l
目前只有推到下面这样就卡住了
:%s/\(^.\)\|./\1_/gc
不知道各位大大有什么提示吗?
先感谢了
2017.06.05补充
若使用
%s/\a\(\a\)\@=\&\(\a\)\@<=\a/_/gc
也可以处理行里面有多个单字的情况
take place
school
会变成
t__e p___e
s____l
谢谢akria,curist,fjm31714的分享
作者: akria (akria)   2017-02-21 23:44:00
%s/\<\@<!.\>\@!/_/gc
作者: fjm31714 (float)   2017-02-22 00:40:00
搞不太懂为什么 ^\@<!.$\@! 这样后面 match 不到
作者: akria (akria)   2017-02-22 01:56:00
因为 $ 要代表行尾,必须满足其中一个条件:1. 在 pattern 最后2. 在 \| 之前3. 在 \) 之前4. 在 \n 之前否则,会被解释成 $ 符号。因此,你可以将 $ 换成 \_$ 或者是 \n 就可以了
作者: fjm31714 (float)   2017-02-23 01:22:00
感谢解释
楼主: javafang (newJ)   2017-02-25 11:37:00
哇,太神奇了,感谢akria大大的神助,我研究一下怎么解释这段语法~
作者: curist (SERIOUSLY!!!???)   2017-03-08 15:06:00
因为实在看不懂akria大的解法 另外google了两个解法:%s/^.\zs.*\ze.$/\=repeat('_',len(submatch(0)))/g:%g/^.\zs.*\ze.$/norm gnr_
作者: akria (akria)   2017-03-11 23:25:00
第二个解法,碰到一行里面只有两个字母时候,会出错。改成 :%g/^.\zs.\+\ze.$/norm gnr_ 比较好我的作法是用到 \@<! 零宽度反向否匹配以及 \@! 零宽度否匹配结构很简单,搜寻 .,但是前面不能有 \< ,后面不能有 \>
作者: curist (SERIOUSLY!!!???)   2017-03-14 10:44:00
学到了 感谢
楼主: javafang (newJ)   2017-06-04 13:36:00
感谢指导~~

Links booklink

Contact Us: admin [ a t ] ucptt.com