此链接通往 Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
用来搜索文件的时候用到的,只是搜索文件名,而 正则表达式是通配符的升级,是搜索文件中的内容。
通配符 | 作用 | 举例 |
---|---|---|
* | 代表任意字符串 | *.sh (所有以.sh结尾的文件) |
? | 代表单个字符 | a?b (acb 或 adb…不可能是 axxb) |
正则表达式是为了 处理大量的字符串而定义的一种规则和方法。
Linux :sed 编辑、 grep 过滤 、awk 显示、vim编辑…
语言: PHP、JAVA、Perl、Python(Perl兼容PCRE)
专门负责在背后处理正则表达式的程序!
字符匹配 | 功能 | 举例 |
---|---|---|
. | 任意 一个 字符 | 两个 . 即代表任意两个字符 |
[ ] | 匹配指定范围内的任意单个字符 | eg:[0-9]、[a-z]、[A-Z]、[a-zA-Z] |
[^] | 匹配不包含这个范围里任意字符的字符 | grep “[^0-9]” filename ; 意为匹配不包括 0-9里任意一个数字 的内容 |
[.] | 放再括号里就表示他自己 | 相当于 \. |
特殊正则表达式 | 作用 | 使用 |
---|---|---|
[:alnum:] | 任何字母或数字;等于[0-9a-zA-Z] | “[[:alnum:]]” |
[:alpha:] | 任何大小写英文;等于[a-zA-Z] | +1 |
[:lower:] | 任何小写字母 | +1 |
[:upper:] | 任何大写字母 | +1 |
[:digit:] | 任何十进制数字 | +1 |
[:xdigit:] | 任何十六进制数字 | +1 |
[:blank:] | 空白字符(空格 和 制表符) | +1 |
[:space:] | 空白字符(比 [:blank:] 的范围更广) | +1 |
[:punct:] | 标点符号 | +1 |
匹配次数 | 作用 | 举例 |
---|---|---|
* | 匹配前面的字符 "0 ~ 任意次" | a*:0次为空,aa、aaa |
.* | 任意字符任意长度(所有字符) | 所有字符 |
\? | 匹配前面的字符 0 or 1 次 | 0次代表空 |
\+ | 匹配前面的字符最少一次 | grep b"\+" (b,bb,bbb…) |
\{n\} | 重复 前面的字符 n次 | 使用 egrep、sed -r 可去掉 “\” 号 |
\{n,m\} | 重复前面的字符最少n次,最多m次 | 同上 |
\{,n\} | 重复前一个字符最多n次 | 同上 |
\{n,\} | 重复前一个字符最少n次 | 同上 |
正则表达式 | 作用 | 举例 |
---|---|---|
^ | 行首 | ^root;root开头的行 |
$ | 行尾 | bash $ ;bash结尾的行 |
^ $ | 空行 | ^ 和 $ 中间为空格的时候,代表空行 |
^aaa$ | 精准匹配此字符 | eg: ^aaa$ ; 代表精确搜索字符aaa |
\b 或 \< | 词首 | 用在单词的左侧 |
\b 或 \> | 词尾 | 用在单词的右侧 |
\< xxx \> | 匹配整个单词 | 可以理解为"^xxx$" |
注意: \b 在左意味着单词的左侧,\b在右为单词的右侧!
正则表达式 | 作用 |
---|---|
\(\) | 将一个或多个字符捆绑在一起,当成一个整体处理 |
\1 、\2… | 调用第一个分组 或 第二个分组(类似于变量) |
\1 称为 后向引用 | \1、\2 表示:将分组的值表达为变量,第一个分组的值为变量1 : \1… |
\| | 表示或者的意思。a\|b — a 或 b。 |
要求: 过滤出 3个连续的 abc:
root@zhengzelin:~# cat zzl.txt
abc
abcabc
abcabcabc
abccc
root@zhengzelin:~# cat zzl.txt | grep -E "abc{3}" # 注意: 使用 grep -E 的时候,\{\} 可以去掉 \ 符号
abccc
root@zhengzelin:~# cat zzl.txt | grep "\(abc\)\{3\}"
abcabcabc
解释: 如果你使用 abc\{3\} 的话,表示重复 c三次,也就是:abccc
这里使用 \(\) 将 abc 括起来 当成一个整理来处理,也就是重复 abc这个字符串三次!
\1 表示分组模式的"输出结果",并不是分组模式本身:
root@zhengzelin:~# cat zzl.txt
123abc456
123abc123
root@zhengzelin:~# cat zzl.txt | grep "\([0-9]\{3\}\).*\1"
123abc123
解释:虽然说 "123abc456" 中的 123 和 456 都符合"[0-9]\{1,3\} " 这个规则!
但是:重点在于 \1 。 这就证明了: "\1 匹配的是分组里的输出结果,并不是匹配规则!"
123abc456
123abc123
这两个 "\([0-9]\{1,3\}\)" 的匹配结果是: 123,所以后面的 \1 就是重复一下 123!
*********************************************************************************************************************************
"☆ 特殊情况:"
eg: \(string1\+\(string2\)*\)
你会发现 一个大分组 里面 有一个小分组!中间使用 "+" 号连接,这个时候:
分组值变量1 —— \1 : string1\+\(string2\)*
分组值变量2 —— \2 :string2
a\|b : 表示 a 或者 b。
C\|c : 表示 C 或者 c。
\(C\|c\)at : 表示 Cat 或者 cat !
**********************************************************************************
eg:
root@zhengzelin:~# cat zzl.txt
cat
Cat
CAT
root@zhengzelin:~# cat zzl.txt | grep "cat\|Cat"
cat
Cat
root@zhengzelin:~# cat zzl.txt | grep "\(c\|C\)at"
cat
Cat
# 取两个字符串相同的部分,然后使用分组功能! \(\)
使用扩展正则表达式必须使用 : egrep 或 grep -E !
与上面基本正则表达式里面的正则表达式一样!
字符匹配 | 功能 | 举例 |
---|---|---|
. | 任意 一个 字符 | 两个 . 即代表任意两个字符 |
[ ] | 匹配指定范围内的任意单个字符 | eg:[0-9]、[a-z]、[A-Z]、[a-zA-Z] |
[^] | 匹配不包含这个范围里任意字符的字符 | grep “[^0-9]” filename ; 意为匹配不包括 0-9里任意一个数字 的内容 |
[.] | 放再括号里就表示他自己 | 相当于 \. |
[^] 是一个正则表达式,代表不匹配 [ ] 里的字符:
根据上图你可以很清楚的看见,数字1是白色的,说明他确实没有被匹配到,结果中红色的部分就是符合你匹配结果的![^1-3] 的意思就是:匹配任意字符,但不包括数字1~3。但是如果某一行包括数字 1~3,它并不会因为过滤掉此行,只会标记此行中的数字 1~3 。(嘴笨不知道如何表达,不好意思。)跟 “grep -v ” 对比一下,你就可以很清楚的看清区别了!
grep -v 会把那些包含数字1或2或3的行都给过滤掉!
与 基础正则表达式一样,唯一的区别是不需要使用 “\” 这个符号!
匹配次数 | 作用 | 举例 |
---|---|---|
* | 匹配前面的字符 "0 ~ 任意次" | a*:0次为空,aa、aaa |
.* | 任意字符任意长度(所有字符) | 所有字符 |
? | 匹配前面的字符 0 or 1 次 | 0次代表空 |
+ | 匹配前面的字符最少一次 | grep b"\+" (b,bb,bbb…) |
{n} | 重复 前面的字符 n次 | 使用 egrep、sed -r 可去掉 “\” 号 |
{n,m} | 重复前面的字符最少n次,最多m次 | 同上 |
{,n} | 重复前一个字符最多n次 | 同上 |
{n,} | 重复前一个字符最少n次 | 同上 |
… | … |
---|---|
\b 或 \< | 词首 |
\b 或 \> | 词尾 |
\< xxx \> | 匹配整个单词 |
注意:这里使用 grep -E 的时候,"\" 不可以去掉!
… | 作用 |
---|---|
() | 将一个或多个字符捆绑在一起,当成一个整体处理 |
\1 、\2… | 调用第一个分组 或 第二个分组(类似于变量) |
| | 表示或者的意思。a|b — a 或 b。 |