前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Unix和Mac上的Shell编程(正则表达式)

在Unix和Mac上的Shell编程(正则表达式)

作者头像
云深无际
发布2021-04-14 14:01:17
7730
发布2021-04-14 14:01:17
举报
文章被收录于专栏:云深之无迹云深之无迹

三个文章是连住同一个小姐姐。

首先我们回忆一下部分的正则表达式

  1. 星号(*)指定匹配的零个活多个字符
  2. 问号(?)可以指定任意单个字符
  3. [...]指定包含在中括号中的任意字符
  4. 点号(.)能够匹配任意单个字符,不论是什么字符

接下来我用ed来演示大量的正则表达式。

共8124个字符

其实,我的测试文档不好,很多的字符串没有,匹配不出来。能演示到什么情况听天由命。

p为打印命令,范围限定为1,$打印整个文件。

/ ... / 查找由空格包围的3个字符

代码语言:javascript
复制
         The Unix operating system was pioneered by Ken
        /         Repeat last search
        Thompson and Dennis Ritchie at Bell Laboratories

1,$s/p.o/XXX/g 将所有的p.o修改成XXX

1,$p 查看修改结果

代码语言:javascript
复制
        The Unix operating system was XXXneered by Ken
        ThomXXXn and Dennis Ritchie at Bell Laboratories
        in the late 1960s. One of the primary goals in
        the design of the Unix system was to create an
        environment that XXXmoted efficient XXXgram
        development.

在第一次搜索中,ed从文件起始部分开始查找,在第一行中发现字符序列was符合指定的模式并将其打印出来。

重复上一次的搜索(ed命令/)使得文件的第二行被显示出来,因为and与指定模式匹配。接下来的替换命令s将符合下列模式的字符系列替换成XXX:字符p,接着是任意单个字符,然后是字符o。前缀1,$指明在全文范围内应用替换操作,替换操作的格式为s/old/new/g,其中s表明是替换操作,斜线用来界定被替换内容和替换内容,g表明执行全局替换,而不仅仅是替换某一行。

匹配行首:脱字符(^)

如果脱字符^作为正则表达式的第一个字符,它可以匹配行首位置。因此,下列正则表达式

代码语言:javascript
复制
^George

只能够匹配出现在行首的George。在正则表达式中,这因此称为“左根部”(left-rooting)。

来看下面的例子:

/the/

代码语言:javascript
复制
        >>in the late 1960s. One of the primary goals in
        >>the design of the Unix system was to create an

/^the/ 查找以the开头的行

代码语言:javascript
复制
 the design of the Unix system was to create an

1,$s/^/>>/ 在每一行的行首插入>>

1,$p

代码语言:javascript
复制
        >>The Unix operating system was pioneered by Ken
        >>Thompson and Dennis Ritchie at Bell Laboratories
        >>in the late 1960s. One of the primary goals in
        >>the design of the Unix system was to create an
        >>environment that promoted efficient program
        >>development.

上述例子中同样展示了如何使用正则表达式^匹配行首位置。其中利用其在每行的首部插入字符>>。

下列命令

代码语言:javascript
复制
1,$s/^/     /

也常用于在行首插入空格(在本例中插入了4个空格)。

匹配行尾:美元符号($)

如同^可以用来匹配行首,美元符号$可以匹配行尾。因此,正则表达式

代码语言:javascript
复制
contents$

能够匹配出现在行尾的字符序列contents。

那么你认为下列正则表达式能够匹配到什么?

代码语言:javascript
复制
  .$

它能够匹配行尾的点号?不仅如此。别忘了点号可以匹配任意字符,因此这个正则表达式匹配的是行尾的任意字符(包括点号)。

那该如何匹配点号?一般而言,如果你想匹配任何对于正则表达式来说有特殊含义的字符,可以在该字符前加上一个反斜线(\)来去除其特殊含义。例如,下面的正则表达式

代码语言:javascript
复制
  \.$

能够匹配以点号结尾的行。正则表达式

代码语言:javascript
复制
   ^\.

能匹配以点号开头的行。

想将反斜线作为普通字符?可以使用连续两个反斜线\\。

代码语言:javascript
复制
   /\.$/                               搜索以点号结尾的行
代码语言:javascript
复制
 development.
代码语言:javascript
复制
  1,$s/$/>>/                           将>>添加到每行的行尾
  1,$p
代码语言:javascript
复制
  The Unix operating system was pioneered by Ken>>
        Thompson and Dennis Ritchie at Bell Laboratories>>
        in the late 1960s. One of the primary goals in>>
        the design of the Unix system was to create an>>
        environment that promoted efficient program>>
        development.>>
代码语言:javascript
复制
 1,$s/..$//                             删除每行最后两个字符
 1,$p
代码语言:javascript
复制
        The Unix operating system was pioneered by Ken
        Thompson and Dennis Ritchie at Bell Laboratories
        in the late 1960s. One of the primary goals in
        the design of the Unix system was to create an
        environment that promoted efficient program
        development.

^和$的一种普遍用法是下面的正则表达式

代码语言:javascript
复制
^$

它能够匹配空行。注意,这个正则表达式和下面的正则表达式不同:

代码语言:javascript
复制
 ^ $

它匹配的是由单个空格组成的行。

我不行了,就写这么多今天。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档