一、查找与替换
编写 Shell脚本时经常用到的两个基本操作:
1.文本查找 (searching) — 寻找含有特定文本的行
2.文本替换(substitution)— 更换找到的文本
可以使用固定字符串完成很多工作,但是正则表达式能提供功能更加强大的标记法,以单个表达式匹配各种实际的文本段。
(一) 查找文本
传统上,有三种程序可以用来整个文本文件:
1. grep :最早的文本匹配程序。使用POSIX定义的基本正则表达式。
2. egrep :扩展式grep (Extended grep) 。此程序使用扩展正则表达式,功能更加强大,代价是耗费更多运算资源,不过以现在系统而言,性能上没有太大差别。
3. fgrep :快速grep(Fast grep)。此程序匹配固定字符串而非正则表达式,其使用优化算法,能有效匹配固定字符串。fgrep 也是唯一可以并行匹配多个字符串的程序。
现代,以上三个版本整合为了一个grep程序,它的行为是通过不同的选项以控制的。
简单的grep:-F使用固定字符串
Example
(二)正则表达式
正则表达式是一种表示方式,让你可以查找匹配特定准则的文本。
正则表达式由两个基本组成部分所建立:
1. 一般字符:指的是没有特殊意义的字符;
2. 特殊字符:常称为元字符 ( meta character ),接下来的部分都会以 meta 字符表示。
POSIX BRE (基本正则表达式)与ERE(扩展正则表达式)的 meta 字符列表:
Example
POSIX 方括号表达式
在方括号表达式里,除了字面上的字符(例如a,b,;等等)之外,另有额外的组成部分, 包括:
1. 字符集 (Character class):以 [ : 与 :] 将关键字组合括起来的POSIX 字符集。关键字描述各种不同的字符集, 例如英文字母字符、控制字符等。
2. 排序符号 (Collating symbol):排序符号指的是将多字符序列视为一个单位。它使用 [ . 与 . ] 将字符组合括起来。排序符号在系统所使用的特定 locale 上各有其定义。
3. 等价字符集 (Fquivalence class):等价字符集列出的是应视为等值的一组字符,例如e 与 ě。它由取自于locale的名字元素组成,以[ = 与 = ] 括住。
这三种构造都必须使用方括号表达式,例如 [ [ : alpha : ] ! ] 匹配任一英文字母或惊叹号 (!) 、[ [ . ch . ] ] 匹配ch(排序元素),但字母 c 或 h 则不是、在法文 French的 locale里,[[ = e = ]] 则可能匹配e、ë、è、é 和 ê。
基本正则表达式(BRE)
匹配单个字符
主要有以下四种方式来匹配单个字符:
1. 一般字符:除了meta字符外的所有文字和数字字符、绝大多数的空白 (whitespace) 字符以及
标点符号字符。
- 例如,正则表达式a,匹配于字符a。
2. 转义的meta字符:想让meta字符表示它们自己的时候,可以在该meta字符前加一个转义符号。
- 例如,\* 匹配 *。
3. 点号字符:匹配 “任一字符” 。
- 例如 a . c 匹配abc、aac等。
4. 方括号表达式匹配单个字符。
- 最简单方式是直接将字符列表放入方括号中,例如,c [aeiouy] t 匹配 cat、cet、cit、cot、cut 及 cyt。
- 在方括号表达式里,^ 放在字首表示取反的意思,例如, c [^aeiouy] t 可以匹配ct之间除了小写元音字母以外的任何字符。
- 方括号表达式可以包括字符范围,例如 [ 0 - 9 ]表示[ 0123456789 ]。
- 方括号表达式中包括字符集、排序符号、等价集,上文已经介绍。
- 在方括号表达式中,所有meta字符都会失去其特殊含义,而一些会引起语义冲突的特殊字符需要特殊处理:
* 要让 ] 进入 [ * \ . ] ,可以将 ] 放在字符列表的最前面 [ ] * \ . ]
* 要让 - 进入 [ * \ . ] ,可以将 - 放在字符列表的最前面 [ - * \ . ]
* 要让 ]、- 同时进入[ * \ . ] ,可以将 ] 放在字符列表的最前面,- 放在字符列表的最后面 [ ] * \ . - ]
后向引用
BRE 提供一种叫后向引用 (backreferences)的机制,指的是“匹配于正则表达式匹配的先前的部分”。
使用后向引用的步骤有两步:文章来源:https://www.toymoban.com/news/detail-406788.html
1. 将子表达式包围在 \( 与 文章来源地址https://www.toymoban.com/news/detail-406788.html
到了这里,关于Shell脚本学习指南-查找与替换篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!