Shell脚本学习指南-查找与替换篇

一、查找与替换

编写 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)的机制,指的是“匹配于正则表达式匹配的先前的部分”。

使用后向引用的步骤有两步:

1. 将子表达式包围在 \( 与

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值