shell 正则表达式
正则表达式是一种特殊的字符序列,用来匹配和操作字符串。在Shell编程中,正则表达式常用于文件名过滤、文本替换等场景,是一种十分重要的工具。本文将介绍Shell中正则表达式的基本语法和用法。
正则表达式语法
在Shell编程中,正则表达式通常由两种字符组成:普通字符和元字符。普通字符就是字母、数字、符号等,元字符则代表一些特殊的含义。
元字符
下面介绍一些常见的元字符:
| 元字符 | 含义 | 
|---|---|
| ^ | 行首 | 
| $ | 行末 | 
| . | 任意字符 | 
| * | 0个或多个 | 
| + | 1个或多个 | 
| ? | 0个或1个 | 
| [ ] | 匹配指定范围内的任意一个字符 | 
| [^ ] | 匹配不在指定范围内的任何字符 | 
| | | 或者 | 
| () | 分组 | 
注意,元字符在正则表达式中具有特殊的含义,如果想匹配这些字符本身,需要使用转义符\,如\$表示匹配字符$本身。
示例代码
下面是一些示例代码,展示正则表达式的用法。
# 匹配以a开头的行
grep '^a' file.txt
# 匹配以a开头和以b结尾的行
grep '^a.*b$' file.txt
# 匹配包含数字的行
grep '[0-9]' file.txt
# 匹配不含数字的行
grep '[^0-9]' file.txt
# 匹配a、b或c字符的行
grep 'a\|b\|c' file.txt
# 捕获分组
echo "ab" | sed -E 's/(a)(b)/\2\1/' # 结果为"ba"
普通字符
在正则表达式中,除了元字符外,其他字符都是普通字符,表示其本身的含义。例如a表示匹配字符a本身,1表示匹配数字1。
量词
量词用于匹配字符出现的次数,有以下几种形式:
| 量词 | 含义 | 
|---|---|
| * | 匹配0个或多个 | 
| + | 匹配1个或多个 | 
| ? | 匹配0个或1个 | 
| {n} | 匹配n个 | 
| {n,} | 匹配n个或以上 | 
| {n,m} | 匹配n到m个之间 | 
注意,如果想匹配字符*、+和?本身,需要在它们前面加上转义符\,如\*表示匹配字符*本身。
POSIX字符类
在正则表达式中,还有一些特殊的字符类,称为POSIX字符类,包括以下几种:
| POSIX字符类 | 含义 | 
|---|---|
| [[:alnum:]] | 匹配任意字母和数字 | 
| [[:alpha:]] | 匹配任意字母 | 
| [[:digit:]] | 匹配任意数字 | 
| [[:space:]] | 匹配任意空白字符(空格、制表符、换行符等) | 
| [[:lower:]] | 匹配任意小写字母 | 
| [[:upper:]] | 匹配任意大写字母 | 
| [[:print:]] | 匹配任意可打印字符(即ASCII码范围内0x20~0x7E) | 
这些字符类经常用于匹配特定类型的字符,例如[[:alpha:]]可以匹配任意字母,而[[:digit:]]可以匹配任意数字。
贪婪匹配和非贪婪匹配
在正则表达式中,有一种匹配方式叫做贪婪匹配,即尽可能多地匹配字符。例如,正则表达式.*可以匹配任意字符。
有时,贪婪匹配会带来一些问题,如匹配结果不准确、效率低下等。这时可以使用非贪婪匹配,即尽可能少地匹配字符。在正则表达式中,非贪婪匹配可以使用?元字符。例如,正则表达式.*?表示尽可能少地匹配任意字符。
锚定符
锚定符用于匹配字符串的位置,包括行首、行末等。在正则表达式中,有以下三种锚定符:
| 锚定符 | 含义 | 
|---|---|
| ^ | 行首 | 
| $ | 行末 | 
| \b | 单词边界 | 
其中^匹配行首,$匹配行末,\b匹配单词边界,即字符的开头、末尾或空格分隔符之间的位置。锚定符常用于限制匹配范围,提高匹配效率。
示例代码
下面是一些示例代码,展示正则表达式的高级用法。
# 匹配以数字开头但不以数字结尾的行
grep '^[0-9].*[^\d]$' file.txt
# 提取URL中的域名
echo "https://www.baidu.com" | sed -E 's#(https?://)?([\w-]+\.)*([\w-]+\.[\w-]+)#\3#'
# 提取HTML标签中的属性值
echo '<a href="https://www.baidu.com">百度</a>' | sed -E 's#<a\s+.*href="([^"]+)".*</a>#\1#'
# 匹配出包含关键词的行,并高亮显示
grep --color '关键词' file.txt
# 替换文本中的空格为制表符
sed -E 's/\s+/\t/g' file.txt
总结
正则表达式是一种十分重要的工具,用于匹配和操作字符串。在Shell编程中,正则表达式常用于文件名过滤、文本替换等场景。掌握正则表达式的基本语法和用法,对于提高Shell编程的效率有很大帮助。本文介绍了正则表达式的基本语法和常见用法,希望能对读者有所启发。
 极客笔记
极客笔记