Regular Expression(正则表达式)
grep
-
global regular expression print
-
grep
查找文本中某种正则表达式的出现并输出匹配的行 -
grep
使用方法:grep
[options] regular_expression [file…],这样将查找files中所有匹配正则表达式的行 -
常用options:
- -i: 忽略大小写
- -v: 反转匹配,只显示不匹配的
- -c: 显示匹配的数量,-v显示不匹配的数量
- -l: 输出匹配的文件名,而不是行
- -h: 输出不显示文件名
-
元字符(Metacharacters):
^ $ . [ ] { } - ? * + ( ) | \
-
使用包含元字符的正则表达式时,必须用引号
' '
括起来来避免歧义 -
.
: 任意字符,至少一个 -
^
,$
: 铆,^表示正则表达式只能出现在行首,$表示只能出现在行尾:[me@linuxbox ~]$ grep -h '^zip' dirlist*.txt zip zipcloak zipgrep zipinfo zipnote zipsplit [me@linuxbox ~]$ grep -h 'zip$' dirlist*.txt gunzip gzip funzip gpg-zip preunzip prezip unzip zip [me@linuxbox ~]$ grep -h '^zip$' dirlist*.txt zip
单独的
^$
将会匹配空行 -
括号表达式和字符集:匹配
[]
中出现的单个字符,例如grep -h '[bg]zip' dirlist*.txt
将获得所有包含
bzip
或者gzip
的文本行。出现在括号表达式内的元符号失去正则表达式的含义,但是有两个例外是^
(用于表示逻辑非操作)和-
(用于表示范围)[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt
将输出除了包含
bzip
和gzip
以外的组合方式[me@linuxbox ~]$ grep -h '^[A-Z]' dirlist*.txt
将输出所有首字母为大写的文本行
-
|
:或。|
本身是pipe操作,即将前面一个表达式的输出作为后面的输入,在正则表达式中表示多种匹配的结果取并集,使用时需要加-E
flag(Extended feature) -
?
:匹配零次或一次,表示?
前面的字符是可选的。例如匹配合法的电话号码,有两种形式是合法的,(nnn) nnn-nnnn
或者nnn nnn-nnnn
,可以使用如下正则表达式:^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$
其中
\(
中的\
表示转义,因为圆括号是元字符,两个?
使得括号的出现是可有可无的 -
*
:匹配零次或者多次。可以用于判断一个句子是否合法(由大写字母开头,后面是由大小写字母和空格组成,句号结尾):[[:upper:]][[:upper:][:lower:] ]*\.
-
+
:匹配一次或者多次。 -
{}
:匹配指定次数{n}
:匹配恰好n次{n,m}
:出现次数大于等于n小于等于m{n,}
:出现次数大于等于n{,m}
:出现次数小于等于m
还是前面匹配电话号码的例子,可以利用花括号表达式改进为:
^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$
可以使用-regex
在find
中使用正则表达式:
[me@linuxbox ~]$ find . -regex '.*[^-_./0-9a-zA-Z].*'
上述命令可以找到包含空格或不合法的文件名。
可以使用--regex
在locate
中使用正则表达式:
[me@linuxbox ~]$ locate --regex 'bin/(bz|gz|zip)'
使用less
可以在文本文档中进行搜索并高亮显示,按/
然后输入正则表达式即可
[me@linuxbox ~]$ less phonelist.txt