正则表达式(Regular expression)是一种符号表示法,被用来识别文本模式。git
最近在学习正则表达式,今天整理一下其中的一些知识点正则表达式
grep 是个很强大的程序,用来找到文件中的匹配文本。这样使用 grep 命令:shell
grep pattern [file...]
当 grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行。(可使用正则表达式)express
grep 程序以这样的方式来接受选项和参数:bash
grep [options] regex [file...]
选项 | 描述 |
---|---|
-i | 忽略大小写。不会区分大小写字符。也可用--ignore-case 来指定。 |
-v | 不匹配。一般,grep 程序会打印包含匹配项的文本行。这个选项致使 grep 程序只会打印不包含匹配项的文本行。也可用--invert-match 来指定。 |
-c | 打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行自己。 也可用--count 选项来指定。 |
-l | 打印包含匹配项的文件名,而不是文本行自己,也可用--files-with-matches 选项来指定。 |
-L | 类似于-l 选项,可是只是打印不包含匹配项的文件名。也可用--files-without-match 来指定。 |
-n | 在每一个匹配行以前打印出其位于文件中的相应行号。也可用--line-number 选项来指定。 |
-h | 应用于多文件搜索,不输出文件名。也可用--no-filename 选项来指定。 |
正则表达式元字符由如下字符组成:学习
^ $ . [ ] { } - ? * + ( ) | \
圆点字符,其被用来匹配任意字符。若是咱们在正则表达式中包含它, 它将会匹配在此位置的任意一个字符。spa
在正则表达式中,插入符号和美圆符号被看做是锚点。这意味着正则表达式 只有在文本行的开头或末尾被找到时,才算发生一次匹配。code
grep -h '^zip' dirlist*.txt #以zip开头的文件 $ grep -h 'zip$' dirlist*.txt #以zip结尾的文件 $ grep -h '^zip$' dirlist*.txt #名字为zip的文件
除了可以在正则表达式中的给定位置匹配任意字符以外,经过使用中括号表达式, 咱们也可以从一个指定的字符集合中匹配单个字符。经过中括号表达式,咱们可以指定 一个待匹配字符集合(包含在不加中括号的状况下会被解释为元字符的字符)。orm
若是在中括号表示式中的第一个字符是一个插入字符(^),则剩余的字符被看做是不会在给定的字符位置出现的 字符集合。ip
插入字符若是是中括号表达式中的第一个字符的时候,才会唤醒否认功能;不然,它会失去 它的特殊含义,变成字符集中的一个普通字符。
[A-Z]
表示A到Z全部字母
[A-Za-z0-9]
表示全部大小写字母和0-9数字
字符集 | 说明 |
---|---|
[:alnum:] | 字母数字字符。在 ASCII 中,等价于:[A-Za-z0-9] |
[:word:] | 与[:alnum:]相同, 但增长了下划线字符。 |
[:alpha:] | 字母字符。在 ASCII 中,等价于:[A-Za-z] |
[:blank:] | 包含空格和 tab 字符。 |
[:cntrl:] | ASCII 的控制码。包含了0到31,和127的 ASCII 字符。 |
[:digit:] | 数字0到9 |
[:graph:] | 可视字符。在 ASCII 中,它包含33到126的字符。 |
[:lower:] | 小写字母。 |
[:punct:] | 标点符号字符。在 ASCII 中,等价于:[-!"#$%&'()*+,./:;<=>?@[\]_`{|}~] |
[:print:] | 可打印的字符。在[:graph:]中的全部字符,再加上空格字符。 |
[:space:] | 空白字符,包括空格、tab、回车、换行、vertical tab 和 form feed.在 ASCII 中, 等价于:[ \t\r\n\v\f] |
[:upper:] | 大写字母。 |
[:xdigit:] | 用来表示十六进制数字的字符。在 ASCII 中,等价于:[0-9A-Fa-f] |
经过改变环境变量 LANG 的值,你能够选择让你的系统使用传统的(ASCII)排列规则这个 LANG 变量包含了语种和字符集。这个值最初由你安装 Linux 系统时所选择的安装语言决定。
locale LANG=zh_CN.UTF-8 LC_CTYPE="zh_CN.UTF-8" LC_NUMERIC=zh_CN.UTF-8 LC_TIME=zh_CN.UTF-8 LC_COLLATE="zh_CN.UTF-8" LC_MONETARY=zh_CN.UTF-8 LC_MESSAGES="zh_CN.UTF-8" LC_PAPER=zh_CN.UTF-8 LC_NAME=zh_CN.UTF-8 LC_ADDRESS=zh_CN.UTF-8 LC_TELEPHONE=zh_CN.UTF-8 LC_MEASUREMENT=zh_CN.UTF-8 LC_IDENTIFICATION=zh_CN.UTF-8 LC_ALL=
把这个 LANG 变量设置为 POSIX,来更改 locale,使其使用传统的 Unix 行为。
export LANG=POSIX
经过把这条语句添加到你的.bashrc 文件中,可使这个更改永久有效。
BRE 能够辨别如下元字符:
^ $ . [ ] *
ERE 添加了如下元字符(以及与其相关的功能):
( ) { } ? + |
添加 alternation,以竖杠线元字符为标记
grep -Eh '^(bz|gz|zip)' dirlist*.txt
这个表达式将会在咱们的列表中匹配以“bz”,或“gz”,或“zip”开头的文件名。
echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$' (555) 123-4567
像 ? 元字符同样,这个 * 被用来表示一个可选的字符
与 ? 不一样,匹配的字符能够出现 任意屡次,不只是一次。
[[:upper:][:lower:] ]*
元字符的做用与 * 很是类似,除了它要求前面的元素至少出现一次匹配。
限定符 | 意思 |
---|---|
{n} | 匹配前面的元素,若是它确切地出现了 n 次。 |
{n,m} | 匹配前面的元素,若是它至少出现了 n 次,可是很少于 m 次。 |
{n,} | 匹配前面的元素,若是它出现了 n 次或多于 n 次。 |
{,m} | 匹配前面的元素,若是它出现的次数很少于 m 次。 |
元 字 符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
{n} | 指定数目的匹配 |
{n,} | 很多于指定数目的匹配 |
{n,m} | 匹配数目的范围( m不超过255) |