Shell编程之正则表达式
1、正则表达式与通配符
Linux中的正则表达式(regular expression)和通配符(wildcard)都是用于匹配字符串的工具,但它们之间存在一些区别和应用场景的不同。
正则表达式是描述一种字符串匹配的模式,通过特殊的字符和语法,可以检查一个字符串是否匹配某种模式,匹配成功后可以进行子串替换、取出符合条件的子串等操作。
比如,使用正则表达式 runoo+b 可以匹配 runoob、runooob、runoooooob 等字符串,其中 + 表示匹配前面的字符 o 至少一次。Linux系统中常用的正则表达式引擎包括grep、sed和awk等。
通配符主要用于匹配文件名或路径名,在Linux系统中通配符可以用来快速查找符合特定规则的文件名或路径名。在通配符中,星号 (*)
代表匹配任意长度的任意字符,问号 (?)
代表匹配任意单个字符。
比如,使用通配符 *.txt 可以查找当前目录下所有后缀为 .txt 的文件。除此之外,Linux系统中还有一些其他的通配符,如方括号([])、花括号({})等,可用于更灵活的匹配。
虽然 Linux 中的正则表达式和通配符都可以用于字符串匹配,但正则表达式支持更加复杂的规则和语法,可以实现更加精确的匹配,通配符相对来说则较为简单,只能进行基本的字符串匹配以及文件名或路径名匹配。
2、基础正则表达式
在 Linux 中,基础正则表达式是指 Basic Regular Expressions (BRE),其特点是使用一些基本的元字符来匹配字符串。
以下是一些基础的元字符及其作用:
.
:匹配任意单个字符。比如a.c
可以匹配 abc、adc、axc 等字符串。^
:匹配行首字符。比如^hello
可以匹配行首为 hello 的字符串。$
:匹配行尾字符。比如hello$
可以匹配行末为 hello 的字符串。[]
:字符集,匹配其中的任意一个字符。比如[abc]
匹配 a 或 b 或 c。[^]
:否定字符集,匹配不在其中的任意一个字符。比如[^abc]
匹配除 a、b、c 以外的任意一个字符。\
:转义字符,可以将特殊字符转义为普通字符,例如\.
可以匹配.
字符本身。*
:匹配前面的字符零次或多次。比如ho*l
可以匹配 hl、hol、hool 等字符串。\{m\}
:匹配前面的字符 m 次。比如ho\{2\}l
匹配 hool,但不匹配 hol 或 hoool。\{m,\}
:匹配前面的字符至少 m 次。比如ho\{2,\}l
匹配 hool、hoool、hoooooool 等字符串。\{m,n\}
:匹配前面的字符至少 m 次,至多 n 次。比如ho\{2,4\}l
匹配 hool、hoool、hoooool,但不匹配 hol 或 hoooooool。()
:用于分组操作,例如(abc)+
表示匹配一个或多个 abc。|
:用于选择操作,例如cat|dog
可以匹配 cat 或 dog。
举例:
查找包含 he 并以 l 结尾的行:
grep 'he.*l$' test.txt
查找包含三个连续小写字母的单词:
grep '[a-z]\{3\}' test.txt
查找包含至少三个连续小写字母的单词:
grep '[a-z]\{3,\}' test.txt
查找包含两到五个连续小写字母的单词:
grep '[a-z]\{2,5\}' test.txt
查找包含 a, e, 或 i 中的任意一个字符的单词 and 查找不包含 a, e, 或 i 中的任意一个字符的单词:
grep '[aei]' test.txt
grep '[^aei]' test.txt
查找以 c 开头,以 t 结尾,并在中间包含两个字母的单词:
grep '^c(..)t$' test.txt
查找包含 e 或 l 的行:
grep 'e|l' test.txt