在系统中处理文件或者文件夹时,都需要对正则表达式有一定的理解。正则表达式是用来定义模式的字符,模式可以用来搜索文本文件或者列出文件和文件夹。
正则表达式的各个部分有很多方法来进行区分,为了便于理解,我们将它分成较多的几个部分,使每个部分尽可能的简单。
正则表达式有以下几个部分:
1)Characters and Groups
2)Anchors
3)Class/Range
4)Quantifier
这一篇博客我们只讨论前两部分:Characters and Groups和Anchors,后两部分在我的下一篇博客中继续讨论。
1、执行搜索
大多数搜索都可以调用命令”grep“来实现,’grep‘命令通过指定正则表达式来对文件和数=数据流进行搜索。
在文件中进行搜索需要指定文件名和使用正则表达式。语法如下:
grep <regexp> <filename>
如果文本来自一个数据流,数据将通过管道(|)传递给命令”grep“。例如将ls的文件列表信息通过管道传给’grep‘,则命令如下:
ls | grep <regexp>
1、Characters and Groups
常见的搜索时对单词、字符、单词组进行搜索。
要对字符’line‘进行搜索,我们可以执行以下命令:
grep line <filename>
我们需要记住我们搜索的不是单词”line“而是字符”line“,例如包含’line‘、’lines‘、’in-line‘等等的行都将被搜索出来,只要是包含这四个字母的都会被搜索。注意搜索是大小写敏感的。
如果想要忽略大小写,则可以使用参数”-i“。命令如下:
grep -i <regexp> <filename>
我们还可以使用参数”-n“获得匹配发生的行号,使用参数’-c‘获得匹配发生的次数,但不会显示匹配项。
为了找到”in“后面跟着字符的所有情况,我们可以使用符号”.“。要匹配所有”in“后面有字符的情况,搜索字符串因该是”in.“,搜索可能返回的结果有”using“、”input“、”information“等等。
因为”.“表示0-1个字符,我们还可以使用星号”*“表示前面的字符出现0次或多次。例如,执行搜索字符串”ing*“,将会找到’in‘、’ing‘、’ingg‘等等。’g‘将出现0次或无数次。如果是搜索’in*‘,可能的结果有’i‘、’in‘、’inn‘等等。
我们还可以创建一组字符。组是放在圆括号内的,但是必须转义字符(\)。若要转义字符,请在字符前放置反斜杠(\),这样“grep”便将该字符视为文字字符,而不是命令字符。当使用圆括号创建一组字符时,将会用到' \('和' \)'。
下面我们来看一些例子。
首先我们创建一个调用示例的文件,在终端下运行以下命令:
grep --help > grephelp.txt
这个命令将会创建一个包含grep帮助信息的文件grephelp.txt。
如果我们想查找字母' ine ',我们可以使用如下命令:
grep ine grephelp.txt
可以看见搜索的结果全部显示出来了:
-x, --line-regexp 强制 PATTERN 仅完全匹配一行
-n, --line-number 输出的同时打印行号
--line-buffered 每行输出清空
-o, --only-matching show only the part of a line matching PATTERN
'使用命令以下命令来计算结果的次数:
grep -c ine grephelp.txt
结果为4。
如果我们想找到in后面跟着其他字符的所有情况,则运行以下命令:
grep in. grephelp.txt
我们可以添加多个’.‘表示后面跟着多个字符,如
grep in.. grephelp.txt
找到的结果可能是‘lines’、‘line’、 ‘binary’、 ‘invocation’等。
如果我们想在一个文件中搜索两个单词,该怎么办?如果我们想搜索单词' before '和' after ',那么我们可以使用如下命令:
grep \(before\|after\) grephelp.txt
我们来看一下这个正则表达式:
\(before\|after\)
’\‘为转译字符,括号用来创建组, |表示’或‘,所以转译后的表达式为:(before | after)。
如果我们想搜索单词' matching '和' matches ',将'match '作为基本单词,并添加' ing '或' es ',命令如下:
grep match\(ing\|es\) grephelp.txt
可以向组中添加更多的项来生成更多的搜索项。圆括号之中的任何内容都将添加到组中的项中,以生成更长的搜索字符串。
3、Anchors
Anchors用于指定特定位置的字符,需要记住两种。第一种Anchors是'^',表示一行的开始。第一种Anchors是'$',表示一行的结尾。
有了Anchors我们可以指定一行的开始和结尾。
举个例子,我们回到主目录,列出主目录下的清单:
cd ~
ls -l
结果如下:
可以看到如果最左边的第一个字符是d,则表明是文件夹,如果是破折号则表明是文件。如果我们只想列出文件夹我们可以执行以下命令:
ls -l | grep ^d
ls -l 输出的信息通过管道传给grep命令进行搜索,正则表达式是第一个字符为’d‘。
同理我们想找到所有以’s‘结尾的行可以执行以下命令:
grep s$ grephelp.txt
我们还可以搜索所有以ne结尾的行:
grep ne$ grephelp.txt
正则表达式非常重要,希望大家可以多多了解。剩下的部分在下一篇博客中讨论。