[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