在Unix和Mac上的Shell编程(正则表达式)
三个文章是连住同一个小姐姐。
首先我们回忆一下部分的正则表达式
星号(*)指定匹配的零个活多个字符
问号(?)可以指定任意单个字符
[...]指定包含在中括号中的任意字符
点号(.)能够匹配任意单个字符,不论是什么字符
接下来我用ed来演示大量的正则表达式。
共8124个字符
其实,我的测试文档不好,很多的字符串没有,匹配不出来。能演示到什么情况听天由命。
p为打印命令,范围限定为1,$打印整个文件。
/ ... / 查找由空格包围的3个字符
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 查看修改结果
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表明执行全局替换,而不仅仅是替换某一行。
匹配行首:脱字符(^)
如果脱字符^作为正则表达式的第一个字符,它可以匹配行首位置。因此,下列正则表达式
^George
只能够匹配出现在行首的George。在正则表达式中,这因此称为“左根部”(left-rooting)。
来看下面的例子:
/the/
>>in the late 1960s. One of the primary goals in
>>the design of the Unix system was to create an
/^the/ 查找以the开头的行
the design of the Unix system was to create an
1,$s/^/>>/ 在每一行的行首插入>>
1,$p
>>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.
上述例子中同样展示了如何使用正则表达式^匹配行首位置。其中利用其在每行的首部插入字符>>。
下列命令
1,$s/^/ /
也常用于在行首插入空格(在本例中插入了4个空格)。
匹配行尾:美元符号($)
如同^可以用来匹配行首,美元符号$可以匹配行尾。因此,正则表达式
contents$
能够匹配出现在行尾的字符序列contents。
那么你认为下列正则表达式能够匹配到什么?
.$
它能够匹配行尾的点号?不仅如此。别忘了点号可以匹配任意字符,因此这个正则表达式匹配的是行尾的任意字符(包括点号)。
那该如何匹配点号?一般而言,如果你想匹配任何对于正则表达式来说有特殊含义的字符,可以在该字符前加上一个反斜线(\)来去除其特殊含义。例如,下面的正则表达式
\.$
能够匹配以点号结尾的行。正则表达式
^\.
能匹配以点号开头的行。
想将反斜线作为普通字符?可以使用连续两个反斜线\\。
/\.$/ 搜索以点号结尾的行
development.
1,$s/$/>>/ 将>>添加到每行的行尾
1,$p
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.>>
1,$s/..$// 删除每行最后两个字符
1,$p
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.
^和$的一种普遍用法是下面的正则表达式
^$
它能够匹配空行。注意,这个正则表达式和下面的正则表达式不同:
^ $
它匹配的是由单个空格组成的行。
我不行了,就写这么多今天。