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

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