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

这篇具有很好参考价值的文章主要介绍了Shell脚本学习指南-查找与替换篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、查找与替换

编写 Shell脚本时经常用到的两个基本操作:

1.文本查找 (searching) — 寻找含有特定文本的行

2.文本替换(substitution)— 更换找到的文本

可以使用固定字符串完成很多工作,但是正则表达式能提供功能更加强大的标记法,以单个表达式匹配各种实际的文本段。

(一) 查找文本

传统上,有三种程序可以用来整个文本文件:

1. grep :最早的文本匹配程序。使用POSIX定义的基本正则表达式。

2. egrep :扩展式grep (Extended grep) 。此程序使用扩展正则表达式,功能更加强大,代价是耗费更多运算资源,不过以现在系统而言,性能上没有太大差别。

3. fgrep :快速grep(Fast grep)。此程序匹配固定字符串而非正则表达式,其使用优化算法,能有效匹配固定字符串。fgrep 也是唯一可以并行匹配多个字符串的程序。

现代,以上三个版本整合为了一个grep程序,它的行为是通过不同的选项以控制的。

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

简单的grep:-F使用固定字符串

Example

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

(二)正则表达式

正则表达式是一种表示方式,让你可以查找匹配特定准则的文本。

正则表达式由两个基本组成部分所建立:

1. 一般字符:指的是没有特殊意义的字符;

2. 特殊字符:常称为元字符 ( meta character ),接下来的部分都会以 meta 字符表示。

POSIX BRE (基本正则表达式)与ERE(扩展正则表达式)的 meta 字符列表:

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

Example

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

POSIX 方括号表达式

在方括号表达式里,除了字面上的字符(例如a,b,;等等)之外,另有额外的组成部分, 包括:

1. 字符集 (Character class):以 [ : 与 :] 将关键字组合括起来的POSIX 字符集。关键字描述各种不同的字符集, 例如英文字母字符、控制字符等。

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

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. 将子表达式包围在 \( 与 文章来源地址https://www.toymoban.com/news/detail-406788.html

到了这里,关于Shell脚本学习指南-查找与替换篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习指南:如何学习机器学习?

    机器学习         你有没有想过计算机是如何从数据中学习和变得更聪明的?这就是机器学习 (ML) 的魔力!这就像计算机科学和统计学的酷炫组合,计算机从大量信息中学习以解决问题并做出预测,就像人类一样。         可以这样想:想象一下,你想教你的电脑

    2024年01月21日
    浏览(58)
  • 【机器学习学习】第一天:入门指南

    引言 当今社会,机器学习技术已经被广泛应用于许多领域,如自然语言处理、图像处理和金融分析等。然而,机器学习这一领域需要掌握大量的数学知识和编程技能,因此对于初学者来说,可能会感到非常困难。本文将为初学者提供一份机器学习入门指南,帮助他们了解机器

    2024年02月02日
    浏览(43)
  • 【深度学习】深度强化学习初学者指南

            GAN(Generative Adversarial Networks)是一种深度学习模型,它由两个神经网络组成:一个生成网络和一个判别网络。生成网络学习如何生成类似于给定数据集的新数据,而判别网络则学习如何区分生成网络生成的数据和原始数据。这两个网络相互竞争,使得生成器越来

    2024年02月13日
    浏览(43)
  • Maven进阶学习指南

    当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要Json序列化的时候需要用到FastJson组件,我们可以通过下载对应jar包加载到项目中。但当一个大的项目同时需要依赖各种各样的外部服务,就存在着配置繁琐、依赖冲突等问题,因此可以通过maven来完成对应的

    2024年02月11日
    浏览(40)
  • Docker 学习指南1

    什么是镜像 镜像是一种轻量级,可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置以来打包好形成一个可交付的运行环境(包括代码,运行时需要的库,环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。只有通过这个镜像

    2024年02月22日
    浏览(38)
  • 实战应用Android进阶学习指南

    作者:禅与计算机程序设计艺术 在软件开发的历史上,从最初的手工编码到后来的脚本编程、GUI编程、打包工具、编译器等各种工具的出现,使得程序员可以将复杂的代码转换成可执行的程序,实现了快速开发、迭代更新、快速部署等效率上的优势。随着互联网的普及、手机

    2024年02月08日
    浏览(51)
  • 现代C++学习指南-具体类

    类作为C++中重要的概念之一,有着众多的特性,也是最迷人的部分! 类是一个加工厂,开发者使用C++提供的各种材料组装这个工厂,使得它可以生产出符合自己要求的数据,通过对工厂的改造,可以精细控制对象从出生到死亡的各种行为,真正达到我的代码我做主的境界。

    2024年02月09日
    浏览(32)
  • 现代C++学习指南-标准库

    在[上一章](https://www.yuque.com/docs/share/adb5b1e4-f3c6-46fd-ba4b-4dabce9b4f2a?# 《现代C++学习指南-类型系统》)我们探讨了C++的类型系统,并提出了从低到高,又从高到低的学习思路,本文就是一篇从高到低的学习指南,希望能提供一种新的视角。 编程语言一般分为两个部分,一部分是语

    2024年02月09日
    浏览(33)
  • 现代C++学习指南-方向篇

    C++是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为

    2024年02月08日
    浏览(37)
  • 现代C++学习指南-类型系统

    在前一篇,我们提供了一个方向性的指南,但是学什么,怎么学却没有详细展开。本篇将在前文的基础上,着重介绍下怎样学习C++的类型系统。 在进入类型系统之前,我们应该先达成一项共识——尽可能使用C++的现代语法。众所周知,出于兼容性的考虑,C++中很多语法都是合

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包