加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

grep命令中扩展正则表达式语法

发布时间:2020-12-14 04:28:45 所属栏目:百科 来源:网络整理
导读:正则表达式包括基本元素和操作符号。只使用基本元素可以构造简单的正则表达式;使用基本元素和操作符号可以构造复杂的正则表达式。 一、基本元素 基本元素分为“匹配位置的基本元素”,“匹配单个字符的基本元素”和“匹配一个字符集合的基本元素”。 1.1、匹

正则表达式包括基本元素和操作符号。只使用基本元素可以构造简单的正则表达式;使用基本元素和操作符号可以构造复杂的正则表达式。

一、基本元素

基本元素分为“匹配位置的基本元素”,“匹配单个字符的基本元素”和“匹配一个字符集合的基本元素”。

1.1、匹配位置的基本元素

匹配位置的基本元素 匹配位置
^ 匹配行首位置
$ 匹配行尾位置
&; 匹配行首位置,跟“^”有点不一样,见后面解释
&; 匹配行尾位置,跟“$”有点不一样,见后面解释
b 匹配单词首尾两端位置
B 匹配单词非首尾两端位置

“行首位置”具体是指“紧邻换行符后面的位置”;“行尾位置”具体是指“后面紧邻换行符的位置”。我们知道,在Windows中换行符是“rn”,而在Linux中换行符是“n”,那么“^,$,&;,&;”能兼容这两种情况吗?答案是这跟具体的grep实现有关。
在作者使用的Linux系统的grep实现中,经过实验可知,“^,$”不兼容两种情况,只支持“n”换行符,“&;,&;”兼容两种情况。
具体实验过程如下:
现在有文本文件“a.txt”,内容如下:

hello
line
world

字节流形式如图1所示。

图1

有文本文件“b.txt”,内容如下:

hello
line
world

字节流形式如图2所示。

图2

分别执行grep -E '^line$' a.txtgrep -E '^line$' b.txt,可得结果分别如图3和图4所示,说明“^,$”不兼容,只支持“n”换行符。

图3

图4

分别执行grep -E '&;line&;' a.txtgrep -E '&;line&;' b.txt,可得结果分别如图5和图6所示,说明“&;,&;”兼容。

图5

图6

“单词首尾两端位置”具体是指“单词与单词分隔符之间的位置”,单词分隔符包括“空格字符,制表符,换行符”等。
现有文本文件“c.txt”,内容如下:

hello world     java
programmer

字节流形式如图7所示。

图7

接连执行以下命令,结果如图8所示。

grep -E 'bhellob' c.txt
grep -E 'bworldb' c.txt
grep -E 'bjavab' c.txt
grep -E 'bprogrammerb' c.txt

图8

接连执行以下命令,结果如图9所示。

grep -E 'BhelloB' c.txt
grep -E 'helBlo' c.txt

图9

1.2、匹配单个字符的基本元素

匹配单个字符的基本元素 匹配字符
ASCII表中可打印字符 可打印字符自身
. 任何字符

1.3、匹配一个字符集合的基本元素

匹配一个字符集合的基本元素 匹配字符集合
[] 匹配括号中任意一个字符
[^] 匹配不在括号中的任意一个字符
[-] 匹配字符范围内的任意一个字符,包含字符范围界限字符
w 等价于“[0-9A-Za-z]”
W 等价于“[^0-9A-Za-z]”

二、操作符号

有3类操作符号:重复操作符,选择操作符和连接操作符。3类操作符有不同的操作优先级顺序,这个优先级顺序无需记忆,只需通过“()”符号显式指定优先级即可。
另外,在正则表达式中可通过“数字”语法来引用第几个“()”符号匹配的内容。现有文本文件“d.txt”,内容如下:

aabcabc
hello world
this is a test text

执行grep -E '([a-z]{2,})1' d.txt命令,结果如图10所示。

图10

2.1、重复操作符

操作符号 含义
? 前面的元素重复0次或者1次,重复0次表示不参与匹配
* 前面的元素重复0次或者任意多次,重复0次表示不参与匹配
+ 前面的元素至少重复1次
{n} 前面的元素重复n次
{n,} 前面的元素至少重复n次
{,m} 前面的元素至多重复m次
{n,m} 前面的元素至少重复n次,至多重复m次

2.2、选择操作符

选择操作符是“|”。“A|B”表示的含义是:在匹配过程中,“A和B”两个正则表达式中只要有一个正则表达式匹配,那么最终结果就是匹配。

2.3、连接操作符

没有特定的符号用来表示连接操作符。将两个正则表达式放在一起就是将这两个正则表达式连接起来了。比如有正则表达式“086”和“[0-9]{11}”,将这两个正则表达式放在一起,即“086[0-9]{11}”,也就是将这两个正则表达式连接起来了。

三、转义

可以使用“”进行特殊字符的转义。比如现有文本文件“f.txt”,内容如下:

+{}|()?

接连执行如下命令,所得结果如图11所示。

grep -E '+' f.txt
grep -E '{' f.txt
grep -E '?' f.txt

图11

四、其他

正则表达式的运转跟“locale”设置息息相关。比如在有些“locale”设置中,“[a-d]”等价于“abcd”,而在有些“locale”设置中,“[a-d]”等价于“[aBbCcDd]”。又比如只在有些“locale”设置中,“w”等价于“[0-9A-Za-z]”,“W”等价于“[^0-9A-Za-z]”才成立。

参考文献: [1]man grep

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读