BBS水木清华站∶精华区
文件的取代
从事编辑工作的时候,常会为了某种需求而将某一共同的用语
以另外一种语辞替换,此情形最常发生在撰写程式的时候。
当然,英文字串由大写改为小写或小写改为大写也是经常可见的。
编辑文件在处理这些事时,就如如下的若干问题产生。
1. 所有要修改的文件,都能如愿以偿的得到适当的修改,不会
有漏网之鱼发生。
2. 修改过文件的一致性,是必要的条件。
因为有这些问题的考量,所以使用 replacement 来完成如是的工作,
就成为最佳的解决之道。现在就来谈谈 EMACS 如何处理 replacement
的问题。
EMACS 处理 replacement 的方法有一气呵成的取代,
与选择性的取代二种。
所给予的被取代文字也有二种,
一、被取代的字串完全与所给予的字串一样;
二、以 Regexp 来做为取代的依据。试分述之。
* 二种的取代方法
o 一气呵成的取代
所谓一气呵成的取代,是一鼓作气将游标之後所有符合条件的
字串,全部以新字串取而代之。
此作法不会一一徵求是否要取而代之的意见,而是自动、全盘
且无条件的取代。
此作法称为 Unconditional Replacement。
o 选择性的取代
选择性的取代,是会先徵求取代的意见,只有在取得同意权时,
才会采取取代的行动。这种取代的行为称为 query replacement。
* 二种被取代字串的表示法
o 被取代的字串完全与所给予的字串一样。
此方法所要取代的文字,与 minibuffer 中所给予的文字一样。
所以,其可能符合条件的选择最多也只有一种。
o Regexp 来做为取代的依据。
此方法就是以 Regexp 来表示所要找寻的字串集。前已论及,所谓的
Regexp 就是以最少的字元组来表达最多的巨集。此时的取代,
就不是单一字串的取代而是某一集合中的所有字串的取代。
所以,以此所得的取代字串就有多重的选择。如何表达正确的 Regexp
会在下一节中详细讨论。
以下就是使用取代( replacement)的方法。
* Unconditional Replace
进行取代时不事先徵求意见,迳行将缓冲区中游标所在位置(包括
游标所在位置本身)之後,所有符合的字串都以新字串取而代之。
o ESC-x replace-string RET string RET newstring RET
此指令是将缓冲区中,所有出现 string 的字串以newstring 取代。
其详细的步骤如下:
1. 键入 ``ESC-x replace-string'',当按下 RET 时,
echo area 会出现
Replace string:
此时可利用 ``Replace string:'' 後的 minibuffer ,
将所要被取代的字串输入,按下 RET 则表示已完成输入的工作 。
2. 按下 RET 时, echo area 会出现如下讯息:
Replace string string with:
此时可利用 minibuffer 给予所要取代的新字串。 键入
RET 时,游标所在位置之後的所有 string 都会转换成newstring。
3. 当转换完成後, echo area 会出现 ``done''。此时就已
大功告成了。
o ESC-x replace-Regexp RET Regexp RETnewstring RET
此方法与上一个方法雷同,不同之处在於所要取代的资料不是
某一个特定的字串,而是某一巨集的字串组。从指令的表示法,
也可以看出所给予的被取代字串是 ``Regexp'' 而非 ``string''。
其详细的执行步骤与字串的取代雷同,只是在 echo area 将所有
的 string 换成 Regexp罢了。
* Query Replace
Query Replace顾名思义就是在取代时会徵询取代的意见,
使用者可根据需要来取决是否要进行取代。以下就介绍字串和
Regexp 的取代。
o ESC-x query-replace RET string RET newstring RET
使用 query replace 的方法及步骤与
unconditional replace的方法雷同,不同处只在於所引用的
指令有异,以及多增了询问的选择。其详细步骤如下
(斜体字表示使用者所输入的资料,粗体字表示系统自行根据
输入资料的回应):
1. ESC-x query-replace RET
2. Query replace: Regexp RET
3. Query replace Regexp with: newstring RET
4. Query replacing Regexp with newstring:(? for help)
此步骤是 query replace 与 unconditional replace
最大不同之处。因为所有徵询的工作都是从此展开。
不知如何使用徵询的使用者可键入 ``?'' 来得到线上的求助。
以下就是键入 ``?'' 系统给予的资讯。
Query replacing Regexp with string.
Type Space or `y' to replace one match, Delete or `n' to skip to next,
RET or `q' to exit, Period to replace one match and exit,
Comma to replace but not move point immediately,
C-r to enter recursive edit (M-C-c to get out again),
C-w to delete match and recursive edit,
C-l to clear the screen, redisplay, and offer same replacement again,
! to replace all remaining matches with no more questions,
^ to move point back to previous match.
使用 query replace 时可有多种选择项。现只介绍常用的几个选项:
1. Space 或 y
当决定以新的字串取代原来的字串时,以 Space 或 y 来表示。
执行 query replace 时,游标会移至下一个合适的字串处,
此时若决定将其取代,则键入 ``Space'' 或 ``y''。当取代完成後,
游标会自动移至下一个合适的字串处。当然也可以放弃所找到
的字串,这就是下一个要讨论的选项了。
2. Delete 或 n
放弃字串的取代,使游标移至下一个目的地,是 Delete 或n
所做的事情。
3. .(Period)
若已找到合适的字串,而想终止所有进一步的取代行为时,
键入``.''可使目前游标所在处的字串以新的字串取代,并且
在取代後立即离开query replace 的状态。
4. !
`` !'' 可使 query replace 恢复为unconditional replace。
因此,若想放弃询问的权利而恢复 unconditional replace 的
状态,键入 ``!'' 就可将游标所位置及其以後所有合适的字串,
都以新字串取而代之。
5. RET 或 `` q''
若想就此离开 query-replace 而不再做进一步的取代动作,
只需按下RET 或 ``q'' 即可。
o ESC-x query-replace-Regexp RET Regexp RET newstring RET
此方法与 `` ESC-x query-replace RET string RET newstring RET''
相似,但此时所取代的不是特定的字串,而是某一字串的巨集。
字串大小写( case sensitive)的问题与取代也有很大
的相关性。因为大小写的问题,对於 unconditional replace 与
query replace 均适用。所以,只举 query-replace
为例说明,至於 unconditional replace 就如法泡制。
当启动 `` ESC-x query-replace RET string RET newstring RET''
时, string 与 newstring 的大小写,关系不同字串的取代。
其规则如下所述:
* 当 string 与 newstring 都以小写的形式出现时,
取代工作的进行,就有三种情形:
o 缓冲区原始字串的第一个字母是以小写为开端时,不论
此字串是否有其它的大写字母,经取代後全转换成小写。
o 若原始字串的每个字母都是大写时,经取代後也维持大写的形式。
o 若原始字串以大写为开端,不论此字串是否还有其它的字母
为大写,只要不是全为大写的情形,取代後只有字串的第一个
字母为大写,其馀一律为小写。
以下举一实例,供参考:
string :abc , newstring: xyz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xyz Xyz xyz xyz Xyz Xyz xyz XYZ
* 当 newstring 部份为大写,而 string 依然维持小写
的情形:
o 若原始字串的第一个字母为大写时,被取代後的第一个字母
仍维持大写的形式。其馀原始字串的大小写,就视 newstring
的大小写而定,与原始字串本身的大小写无关。
o newstring 的字母若以大写出现,则被取代的原始字串
也会在相对应的位置以大写的形式出现。
o 若原始字串全为大写时,取代後仍维持大写的形式。
以下为若干实例,供参考:
o string :abc , newstring: Xyz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: Xyz Xyz Xyz Xyz Xyz Xyz Xyz XYZ
o string :abc , newstring: xYz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xYz XYz xYz xYz XYz XYz xYz XYZ
o string :abc , newstring: xyZ
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xyZ XyZ xyZ xyZ XyZ XyZ xyZ XYZ
o string :abc , newstring: XYz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: XYz XYz XYz XYz XYz XYz XYz XYZ
o string :abc, newstring: xYZ
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xYZ XYZ xYZ xYZ XYZ XYZ xYZ XYZ
o string :abc , newstring: XYZ
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ
* 只要 string 有大写的字母出现时,取代後字串的大小写,
就完全依照 newstring 的大小写。换言之, newstring
为大写的地方依旧为大写,为小写的地方依然为小写。
以下为若干实例,供参考:
o string :Abc , newstring: xyz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz
o string :aBc , newstring: xyz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz
o string :ABc , newstring: xyz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz
o string :ABC , newstring: xyz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xyz xyz xyz xyz xyz xyz xyz xyz
o string :aBC , newstring: Xyz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: Xyz Xyz Xyz Xyz Xyz Xyz Xyz Xyz
o string :Abc , newstring: xYz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: xYz xYz xYz xYz xYz xYz xYz xYz
o string :aBc , newstring: XYz
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为:XYz XYz XYz XYz XYz XYz XYz XYz
o string :ABC , newstring: XYZ
原始文件为: abc Abc aBc abC ABc AbC aBC ABC
经过取代为: XYZ XYZ XYZ XYZ XYZ XYZ XYZ XYZ
讨论至此,取代的部份应该可以告一段落了。接下来,就是要将
一直未正式讨论的 Regular Expression 做一详尽的说明。
BBS水木清华站∶精华区