【BASH】回顾与知识点梳理(九)

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

九. 扩展正则表达式(延伸正规表示法)

事实上,一般读者只要了解基础型的正规表示法大概就已经相当足够了,不过,某些时刻为了要简化整个指令操作, 了解一下使用范围更广的延伸型正规表示法的表示式会更方便呢!举个简单的例子好了,在上节的例题三的最后一个例子中,我们要去除空白行与行首为 # 的行列,使用的是

grep -v '^$' regular_express.txt | grep -v '^#'

需要使用到管线命令来搜寻两次!那么如果使用延伸型的正规表示法,我们可以简化为:

egrep -v '^$|^#' regular_express.txt

9.1 egrep命令语法

下面是 egrep 命令的基本语法:

egrep [选项] '模式' 文件

选项:

选项 描述
-i 忽略大小写进行匹配
-v 反向匹配,输出不匹配模式的行
-n 显示匹配行的行号
-r 递归搜索,对目录下的所有文件进行匹配
-w 匹配整词,仅匹配单词的完整匹配
-c 统计匹配到的行数
-A 显示匹配行及其后面指定行数的内容
-B 显示匹配行及其前面指定行数的内容
-C 显示匹配行及其前后指定行数的内容

匹配指定模式的行(用法和grep相同)

#要查找文件中匹配指定模式的行,可以使用以下命令:
egrep '模式' 文件
#例如,要在文件 regular_express.txt 中查找包含字符串 "good" 的行,可以运行以下命令:
[root@node-135 yurq]# egrep 'good' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.^M

忽略大小写匹配(用法和grep相同)

如果要忽略模式的大小写,可以使用 -i 选项。例如:

[root@node-135 yurq]# egrep -i 'GOOD' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.^M

反向匹配(用法和grep相同)

要输出不匹配指定模式的行,可以使用 -v 选项。例如:

[root@node-135 yurq]# egrep -iv 'GOOD' regular_express.txt
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.

显示行号(用法和grep相同)

要显示匹配行的行号,可以使用 -n 选项。例如:

[root@node-135 yurq]# egrep -n 'good' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
9:Oh! The soup taste good.^M

递归搜索目录(用法和grep相同)

要在目录及其子目录下的所有文件中递归搜索匹配的行,可以使用 -r 选项。例如:

[root@node-135 yurq]# egrep -r 'good' .
./regular_express.txt:"Open Source" is a good mechanism to develop programs.
./regular_express.txt:Oh! The soup taste good.^M
./regular_express.txt.bak:"Open Source" is a good mechanism to develop programs.
./regular_express.txt.bak:Oh! The soup taste good.^M

匹配整词(用法和grep相同)

要仅匹配单词的完整匹配,可以使用 -w 选项。例如:

[root@node-135 yurq]# egrep -w 'good' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.^M

统计匹配行数(用法和grep相同)

要统计匹配到的行数,可以使用 -c 选项。例如:

[root@node-135 yurq]# egrep -c 'good' regular_express.txt
2

显示匹配行及其上下文内容(用法和grep相同)

要显示匹配行及其前后指定行数的内容,可以使用 -A、-B 和 -C 选项。例如:

[root@node-135 yurq]# egrep -i -A2 -B2 'good' regular_express.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
--
Her hair is very beauty.^M
I can't finish the test.^M
Oh! The soup taste good.^M
motorcycle is cheap than car.
This window is clear.
[root@node-135 yurq]# egrep -i -C2 'good' regular_express.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
--
Her hair is very beauty.^M
I can't finish the test.^M
Oh! The soup taste good.^M
motorcycle is cheap than car.
This window is clear.

9.2 egrep和grep的区别

egrep和grep是Linux命令行中最常用的文本搜索工具,它们的功能有很大的相似性,但也有一些明显的不同之处,这些不同之处会影响到它们的使用方式。下面就从功能、参数、应用场景等角度来探讨egrep与grep的区别。

  • 功能方面:grep是一种强大的文本搜索工具,它使用基础正则表达式来搜索文本,egrep是一种增强版的grep,它使用更多的正则表达式来搜索文本,比如可以使用更多的元字符,更多的重复模式,更多的可选项等。
  • 参数方面:egrep支持更多的参数,它比grep支持更多的选项,可以更灵活地处理文件;
  • 应用场景方面:egrep适用于需要精确搜索的场景,例如搜索某个字符串出现的次数,而grep则适用于简单的文本搜索。

延伸型正规表示法可以透过群组功能『 | 』来进行一次搜寻!那个在单引号内的管线意义为『或 or』啦! 是否变的更简单呢?此外,grep 预设仅支持基础正规表示法,如果要使用延伸型正规表示法,你可以使用 grep -E , 不过更建议直接使用 egrep !直接区分指令比较好记忆!其实 egrep 与 grep -E 是类似命令别名的关系啦!

熟悉了正规表示法之后,到这个延伸型的正规表示法,你应该也会想到,不就是多几个重要的特殊符号吗? ^_^y 是的~所以,我们就直接来说明一下,延伸型正规表示法有哪几个特殊符号?由于底下的范例还是有使用到 regular_express.txt ,不巧的是刚刚我们可能将该文件修改过了 @_@,所以,请重新下载该文件来练习喔!

9.3 延伸型的正规表示法的特殊字符

RE 字符 意义与范例
+ 意义:重复『一个或一个以上』的前一个 RE 字符
范例:搜寻 (god) (good) (goood)… 等等的字符串。 那个 o+ 代表『一个以上的 o 』所以,底下的执行成果会将第 1, 9, 13 行列出来。
egrep -n 'go+d' regular_express.txt
? 意义:『零个或一个』的前一个 RE 字符
范例:搜寻 (gd) (god) 这两个字符串。 那个 o? 代表『空的或 1 个 o 』所以,上面的执行成果会将第 13, 14 行列出来。 有没有发现到,这两个案例( ‘go+d’ 与 ‘go?d’ )的结果集合与 ‘go*d’ 相同?想想看,这是为什么喔! ^_^
egrep -n 'go?d' regular_express.txt
| 意义:用或( or )的方式找出数个字符串
范例:搜寻 gd 或 good 这两个字符串,注意,是『或』! 所以,第 1,9,14 这三行都可以被打印出来喔!那如果还想要找出 dog 呢?
egrep -n 'gd|good' regular_express.txt
egrep -n 'gd|good|dog' regular_express.txt
() 意义:找出『群组』字符串
范例:搜寻 (glad) 或 (good) 这两个字符串,因为 g 与 d 是重复的,所以,我就可以将 la 与 oo 列于 ( ) 当中,并以 | 来分隔开来,就可以啦!
egrep -n 'g(la|oo)d' regular_express.txt
()+ 意义:多个重复群组的判别
范例:将『AxyzxyzxyzxyzC』用 echo 叫出,然后再使用如下的方法搜寻一下!echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
上面的例子意思是说,我要找开头是 A 结尾是 C ,中间有一个及以上的 “xyz” 字符串的意思~

()+示例,可以看到只能完整匹配xyz的一个及以上

[root@node-135 yurq]# echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
AxyzxyzxyzxyzC
[root@node-135 yurq]# echo 'AxyzC' | egrep 'A(xyz)+C'
AxyzC
[root@node-135 yurq]# echo 'AxyzxyzxyzxyzC' | egrep 'A(x)+C'
[root@node-135 yurq]# echo 'AxyzxyzxyzxyzC' | egrep 'A(yzx)+C'
[root@node-135 yurq]#

另外,要特别强调的是,那个 ! 在正规表示法当中并不是特殊字符, 所以,如果你想要查出来文件中含有 ! 与 > 的字行时,可以这样:

grep -n '[!>]' regular_express.txt

这样可以了解了吗?常常看到有陷阱的题目写:『反向选择这样对否? '[!a-z]'?』, 呵呵!是错的呦~要 '[^a-z]' 才是对的!

匹配重复字符(用法和grep不同)

要匹配重复出现的字符,可以使用 *、+ 或 ? 符号。例如,要匹配重复出现的字母 “o”,可以运行以下命令:

egrep 'o*' example.txt   # 匹配0个或多个"o"
egrep 'o+' example.txt   # 匹配1个或多个"o"
egrep 'o?' example.txt   # 匹配0个或1个"o"

匹配分组模式(用法和grep不同)

要匹配分组模式,可以使用小括号 ()。例如,要匹配 “good” 或 “glad”,可以运行以下命令:

[root@node-135 yurq]# egrep 'g(oo|la)d' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.^M
The world <Happy> is the same with "glad".

匹配’或’模式(用法和grep不同)

[root@node-135 yurq]# egrep 'good|glad' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.^M
The world <Happy> is the same with "glad".

匹配重复群组(用法和grep不同)

g和d之间仅能出现o

[root@node-135 yurq]# egrep 'g(o)+d' regular_express.txt
"Open Source" is a good mechanism to develop programs.
Oh! The soup taste good.^M
Oh! My god!

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

猜你喜欢

转载自blog.csdn.net/u010230019/article/details/132097203
今日推荐