看板 Editor 關於我們 聯絡資訊
想在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://www.ptt.cc/bbs/Editor/M.1487685547.A.2CC.html
akria: %s/\<\@<!.\>\@!/_/gc 02/21 23:44
fjm31714: 搞不太懂為什麼 ^\@<!.$\@! 這樣後面 match 不到 02/22 00:40
akria: 因為 $ 要代表行尾,必須滿足其中一個條件: 02/22 01:56
akria: 1. 在 pattern 最後 02/22 01:56
akria: 2. 在 \| 之前 02/22 01:57
akria: 3. 在 \) 之前 02/22 01:57
akria: 4. 在 \n 之前 02/22 01:57
akria: 否則,會被解釋成 $ 符號。 02/22 01:58
akria: 因此,你可以將 $ 換成 \_$ 或者是 \n 就可以了 02/22 01:58
fjm31714: 感謝解釋 02/23 01:22
javafang: 哇,太神奇了,感謝akria大大的神助,我研究一下怎麼解 02/25 11:37
javafang: 釋這段語法~ 02/25 11:37
curist: 因為實在看不懂akria大的解法 另外google了兩個解法 03/08 15:06
curist: :%s/^.\zs.*\ze.$/\=repeat('_',len(submatch(0)))/g 03/08 15:06
curist: :%g/^.\zs.*\ze.$/norm gnr_ 03/08 15:07
akria: 第二個解法,碰到一行裡面只有兩個字母時候,會出錯。 03/11 23:25
akria: 改成 :%g/^.\zs.\+\ze.$/norm gnr_ 比較好 03/11 23:26
akria: 我的作法是用到 \@<! 零寬度反向否匹配 03/11 23:29
akria: 以及 \@! 零寬度否匹配 03/11 23:29
akria: 結構很簡單,搜尋 .,但是前面不能有 \< ,後面不能有 \> 03/11 23:31
curist: 學到了 感謝 03/14 10:44
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