作者javafang (newJ)
看板Editor
標題[vim ] 保留前後字元,修改中間的字元
時間Tue Feb 21 21:59:05 2017
想在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的分享
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 14.203.189.15
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Editor/M.1487685547.A.2CC.html
1F:推 akria: %s/\<\@<!.\>\@!/_/gc 02/21 23:44
2F:推 fjm31714: 搞不太懂為什麼 ^\@<!.$\@! 這樣後面 match 不到 02/22 00:40
3F:推 akria: 因為 $ 要代表行尾,必須滿足其中一個條件: 02/22 01:56
4F:→ akria: 1. 在 pattern 最後 02/22 01:56
5F:→ akria: 2. 在 \| 之前 02/22 01:57
6F:→ akria: 3. 在 \) 之前 02/22 01:57
7F:→ akria: 4. 在 \n 之前 02/22 01:57
8F:→ akria: 否則,會被解釋成 $ 符號。 02/22 01:58
9F:→ akria: 因此,你可以將 $ 換成 \_$ 或者是 \n 就可以了 02/22 01:58
10F:→ fjm31714: 感謝解釋 02/23 01:22
11F:→ javafang: 哇,太神奇了,感謝akria大大的神助,我研究一下怎麼解 02/25 11:37
12F:→ javafang: 釋這段語法~ 02/25 11:37
13F:推 curist: 因為實在看不懂akria大的解法 另外google了兩個解法 03/08 15:06
14F:→ curist: :%s/^.\zs.*\ze.$/\=repeat('_',len(submatch(0)))/g 03/08 15:06
15F:→ curist: :%g/^.\zs.*\ze.$/norm gnr_ 03/08 15:07
16F:推 akria: 第二個解法,碰到一行裡面只有兩個字母時候,會出錯。 03/11 23:25
17F:→ akria: 改成 :%g/^.\zs.\+\ze.$/norm gnr_ 比較好 03/11 23:26
18F:→ akria: 我的作法是用到 \@<! 零寬度反向否匹配 03/11 23:29
19F:→ akria: 以及 \@! 零寬度否匹配 03/11 23:29
20F:→ akria: 結構很簡單,搜尋 .,但是前面不能有 \< ,後面不能有 \> 03/11 23:31
21F:推 curist: 學到了 感謝 03/14 10:44
22F:→ javafang: 感謝指導~~ 06/04 13:36
※ 編輯: javafang (203.213.93.179), 06/05/2017 07:14:28
※ 編輯: javafang (203.213.93.179), 06/05/2017 10:21:33