Unix Shell正则表达式 - 极悦
首页 课程 师资 教程 报名

Unix Shell正则表达式

  • 2022-07-01 09:50:30
  • 1099次 极悦

常用表达

正则表达式 (regex) 是一种可用于搜索和替换的文本模式。正则表达式类似于通配符中使用的 Unix 通配符,但功能更强大,可用于搜索、替换和验证文本。

Java正则表达式用于许多 Unix 命令(例如findand grep)以及大多数编程语言(例如 R 和 Python)中。

我们仅在此处显示基本用法以帮助您入门。要进行练习,请先花一些时间在http://regex101.com上更好地了解如何使用正则表达式,然后了解如何在文本编辑器中使用它们进行搜索和替换。

匹配字符

我们将练习使用grep. 如果匹配成功,则返回该行文本;否则什么都没有。

In [1]:
grep --help | head -n 20
用法:grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
        [-e 模式] [-f 文件] [--binary-files=值] [--color=when]
        [--context[=num]] [--directories=action] [--label] [--line-buffered]
        [--null] [模式] [文件 ...]

文字字符匹配

In [2]:
echo abcd | grep abcd
A B C D
In [3]:
echo abcd | grep bc
A B C D

不匹配

In [4]:
echo abcd | grep ac

不区分大小写的匹配

In [5]:
echo abcd | grep -i A
A B C D
In [6]:
echo abcd | grep A

匹配任何单个字符

恰好匹配一个字符。

In [7]:
echo abcd | grep a.c
A B C D
In [8]:
echo abcd | grep a..c
In [9]:
echo abcd | grep a..d
A B C D

匹配字符集

In [10]:
echo a2b | grep [0123456789]
a2b
In [11]:
echo a2b | grep [0-9]
a2b
In [12]:
echo a2b | grep [abc]
a2b
In [13]:
echo a2b | grep [def]
In [14]:
echo a2b | grep [a-z]
a2b
In [15]:
echo a2b | grep [A-Z]

例外

字符集中的^表示匹配集合中不存在的任何内容。

In [16]:
echo a2b | grep [A-Z]
In [17]:
echo a2b | grep [^A-Z]
a2b

预定义的字符集

许多有用的字符集(例如所有数字)已被预定义为 可以在正则表达式中使用的字符类。字符类在 Unix shell 中有点笨拙,但在编程语言中经常使用更简单的形式(例如,' :raw-latex:`\d` '而不是 '[:digit:]')。

In [18]:
echo a2b | grep ['[:alpha:]']
a2b
In [19]:
echo a2b | grep ['[:digit:]']
a2b
In [20]:
echo a2b | grep ['[:punct:]']
In [21]:
echo a2,b | grep ['[:punct:]']
a2,b

替代表达

我们在这里使用 -E 参数来避免必须转义特殊字符

-E, --extended-regexp
        Interpret pattern as an extended regular expression (i.e. force
        grep to behave as egrep).'
In [22]:
echo cat | grep -E '(cat|dog)'
猫

没有-E

我们需要转义特殊字符(和。|)

In [23]:
echo cat | grep '\(cat\|dog\)'
猫

我们也爱狗

In [24]:
echo dog | grep -E '(cat|dog)'
狗

但不是狐狸

In [25]:
echo fox | grep -E '(cat|dog)'

小心 - 使用方括号意味着不同的东西

In [26]:
echo fox | grep -E '[cat|dog]'
狐狸

字符集修饰符

锚点

^表示行首和$行尾。

In [27]:
echo abcd | grep ^ab
A B C D
In [28]:
echo abcd | grep ab$
In [29]:
echo abcd | grep ^cd
In [30]:
echo abcd | grep cd$
A B C D

重复字符

+匹配一个或多个前面的字符集

'*' 匹配零个或多个前面的字符集

'{m, n}' 匹配前面字符集的 m 和 n 次重复。

In [31]:
echo abbbcd | grep abcd
In [32]:
echo abbbcd | grep -E ab+cd
abbbcd
In [33]:
echo abbbcd | grep -E ab*cd
abbbcd
In [34]:
echo abbbcd | grep -E 'ab{1,5}cd'
abbbcd
In [35]:
echo abbbcd | grep -E a[bc]+d
abbbcd

将单词与单词边界匹配

\<并\>指出单词边界。也就是说,\只会匹配or但不匹配or 。foo barbar foofoobarbarfoo

In [36]:
echo 'other ones go together' | grep 'the'
其他的一起去
In [37]:
echo 'other ones go together' | grep '\<the\>'
In [38]:
echo 'other ones go together' | grep '\<other\>'
其他的一起去

捕获组和反向引用

In [39]:
echo "123_456_123_456" | grep -E '([0-9]+).*\1'
123_456_123_456
In [40]:
echo "123_456_123_456" | grep -E '([0-9]+)_([0-9]+)_\1_\2'
123_456_123_456
In [41]:
echo "123_456_123_123" | grep -E '([0-9]+)_([0-9]+)_\1_\2'

以上就是关于“Unix Shell正则表达式”的介绍,如果大家想了解更多相关知识,可以关注一下极悦的Java极悦在线学习,里面的课程内容细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交