第六章 全局替換
全局替換真正使用的是ex的兩個(gè)命令: :g (全局)和 :s (替換),替換命令的語法如下:
:s/old/new/
將把當(dāng)前行中模式old第一次出現(xiàn)修改為new./(斜杠)是命令不同部分間的分隔符(當(dāng)斜杠為該行的最后一個(gè)字符時(shí),它是可選的)
:/s/old/new/g
把當(dāng)前行old的每次出現(xiàn)改為new,而不只是該行的第一個(gè)old.:s命令允許替換串后面帶有選項(xiàng).g就代表全局(g選項(xiàng)影響一行中的每個(gè)模式,跟:g命令是不同的)
通過在:s命令前加上地址前綴,可以把它的范圍擴(kuò)展到多行,例如
:50,100s/old/new/g
:1,$s/old/new/g
:%s/old/new/g
確認(rèn)替換
輸入 u 來取消任何搜索替換命令
在進(jìn)行全局替換前使用 :w 保存文件,這樣可以 不保存編輯重開文件 或者輸入 :e!
在替換前看到搜索結(jié)果和確認(rèn)每個(gè)替換,則可以在替換命令的尾部加上c選項(xiàng)(用于確認(rèn))
:1,30s/his/the/gc
vi的 n(重復(fù)上次搜索) 和 點(diǎn)(.)(重復(fù)上次命令) 命令的結(jié)合也是一種極為有用的方法
/which ????????????搜索which
cwthat ESC ????????修改為that
n ????????????????重復(fù)搜索,跳過一次修改
n ????????????????重復(fù)修改
. ????????????????重復(fù)修改(如果正確)
上下文相關(guān)替換
:%s/editer/editor/g ????????把文件中editer的每次出現(xiàn)替換為editor
:g/patern/s/old/new/g
第一個(gè)g是在文件的所有行上執(zhí)行的命令,模式pattern識別要發(fā)生替換的行.在那些包含模式pattern的行上,ex將把old替換(s)為new.最后的g表示在該行上進(jìn)行全部替換
如果用來進(jìn)行搜索的模式與想要修改的模式相同,就不用重復(fù)它
:g/string/s//new/g
將搜索包含string的行并對string進(jìn)行替換
模式匹配規(guī)則
元字符在搜索模式中的使用
[]中需要\轉(zhuǎn)義的是\ - 和 ]
\<????\>????\(????\) ????比較特殊
POSIX的方括號表達(dá)式
方括號內(nèi)的字符組稱為"括號表達(dá)式" .在括號表達(dá)式中,除了像a !等那樣的字面字符以外,還可以有其他的組成部分,他們是
字符類 ????????由[:和:]包圍的關(guān)鍵字組成,[[:alpha:]!]匹配任何一個(gè)單字母或感嘆號
整理符號 ????被看做單一單元的多字符序列,由[.和.]所包圍的字符組成,[[.ch.]]匹配ch
等價(jià)類 ????????[[=e=]]在法語中可以匹配ēéěèe
POSIX字符類
類 |
匹配字符 |
[:alnum:] |
字母數(shù)字字符 |
[:alpha:] |
字母字符 |
[:blank:] |
空格和制表符 |
[:cntrl:] |
控制字符 |
[:digit:] |
數(shù)字字符 |
[:graph:] |
可打印和可見 ( 非空格 ) 字符 |
[:lower:] |
小寫字符 |
[:print:] |
可打印字符 ( 包括空白 ) |
[:punct:] |
標(biāo)點(diǎn)字符 |
[:space:] |
空白字符 |
[:upper:] |
大寫字符 |
[:xdigit:] |
十六進(jìn)制數(shù)字 |
元字符在替換串中的作用
當(dāng)進(jìn)行全局替換時(shí),正則表達(dá)式只有在命令的搜索部分(第一部分)時(shí)才具有特殊含義,例如:
:%s/1\. Start/2. Next, start with $100/
后面的替換串按照 字面意思處理字符.和$ ,而不對它們進(jìn)行轉(zhuǎn)義
在替換串中具有特殊含義的元字符
\ n ???? 前向引用括號包圍的模式匹配串
\ ????把其后的字符轉(zhuǎn)義,\\輸出自己
& ????代表與搜索模式相匹配的整個(gè)文本???? :%s/abcdefg/&hij/ ????替換文本將是 abcdefghij
\u 或 \l
把替換串中的下一個(gè)字符分別變?yōu)榇髮懟蛐?例如 :%s/\(Thant\) or \(this\)/\u\2 or \l\1/
\U或\L和\e或\E
從它們后面開始到替換串結(jié)束或到\e或\E出現(xiàn)為止的 所有字符都 轉(zhuǎn)換為大些或小寫,例如要把Fortran變成大寫,可以輸入 :%s/Fortran/\UFortran/ 或: %s/Fortran/\U&/
輸入 :set ic 或者 :set ignorecase 忽略大小寫
更多的替換技巧
-
:s 和 :s//~/ 相同 , 即重復(fù)上次替換
-
& 表示一次替換 , 比如 :%&g 在各處重復(fù)上次替換
-
& 鍵也可以作為 vi 命令來執(zhí)行 :& RETURN 命令比 :s RETURN 輸入更快
-
:~ 命令和 :& 命令相似 , :~ 使用的搜索模式是上次 任何命令 所使用的正則表達(dá)式 , 而不局限于上次替換命令使用的正則表達(dá)式例如
:s/red/blue/
/green
:~
等價(jià)于 :s/green/blue/
-
除 / 外 , 可以使用除 \ " | 之外的任何非字母表、非空白字符作為分隔符 , 例如
:%s;/user1/tim;/home/tim;g
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
