Shell 正则表达式
在 Shell 脚本中,正则表达式是一种强大且常用的工具,它可以用来匹配、搜索、替换和截取字符串。本文将介绍 Shell 中的正则表达式,并给出一些示例代码。
Shell 正则表达式语法
在 Shell 中,正则表达式使用的是 POSIX 扩展正则表达式语法(extended regular expression syntax)。常见的元字符和字符类如下:
特殊字符 | 含义 |
---|---|
. |
匹配任意字符 |
^ |
匹配行首 |
$ |
匹配行尾 |
* |
匹配前一个字符出现 0 次或多次 |
+ |
匹配前一个字符出现 1 次或多次 |
? |
匹配前一个字符出现 0 次或 1 次 |
| |
表示或操作 |
[charset] |
匹配字符集中的任意一个字符 |
[^charset] |
匹配未在字符集中出现的任意一个字符 |
[a-z] |
匹配 a 到 z 之间的任意一个小写字母 |
[A-Z] |
匹配 A 到 Z 之间的任意一个大写字母 |
[0-9] |
匹配 0 到 9 之间的任意一个数字 |
\s |
匹配任意空白字符,包括空格、制表符、换行符等 |
\S |
匹配任意非空白字符 |
上表中的含义可能并不完全准确,具体使用时需结合实际情况理解。
Shell 正则表达式示例
下面给出几个常见的 Shell 正则表达式示例,包括匹配手机号、URL 地址等:
- 匹配手机号
#!/bin/bash
read -p "请输入手机号:" phone_number
if [[ phone_number =~ ^1[3456789][0-9]{9} ]]; then
echo "您输入的手机号 phone_number 符合要求"
else
echo "您输入的手机号phone_number 不符合要求"
fi
上述代码利用了 =~
运算符来进行正则表达式匹配,其中 ^1[3456789][0-9]{9}$ 表示以 1 开头,第二位为 3/4/5/6/7/8/9 中任意一个,后面跟着 9 位数字的字符串。
- 查询目录下的所有 .md 文件
#!/bin/bash
for file in ./*.md; do
echo "$file"
done
上述代码利用了 ./*.md
正则表达式来匹配当前目录下的所有扩展名为 .md 的文件。
- 替换字符串中的数字
#!/bin/bash
string="abcd1234"
echo "替换前:string"
# 将字符串中的所有数字替换为 #
new_string=(echo "string" | sed 's/[0-9]/#/g')
echo "替换后:new_string"
上述代码利用了 s/[0-9]/#/g
正则表达式来将字符串中的所有数字替换为 #。
- 匹配 URL 地址
#!/bin/bash
read -p "请输入 URL 地址:" url
if [[ url =~ ^(http|https)://[a-z0-9]+(\.[a-z0-9]+){1,3}.* ]]; then
echo "您输入的 URL 地址 url 符合要求"
else
echo "您输入的 URL 地址url 不符合要求"
fi
上述代码利用了 ^(http|https)://[a-z0-9]+(\.[a-z0-9]+){1,3}.*$
正则表达式来匹配 URL 地址,其中 (http|https) 表示以 http 或 https 开头,[a-z0-9]+(.[a-z0-9]+){1,3} 表示后面跟着 1 到 3 段类似于 .xxx 的字符串,.* 表示后面还可以跟着任意字符。
Shell 正则表达式使用技巧
在实际使用中,可以用一些技巧来简化正则表达式的书写和匹配过程。
- 使用 grep 命令
grep 命令可以用来从文件或标准输入中搜索指定的模式,并输出匹配的行。它的使用非常简单,如下所示:
grep pattern file
其中 pattern 表示要匹配的正则表达式,file 表示要搜索的文件。
例如,查找文件 test.txt 中包含单词 hello 的行:
grep hello test.txt
- 使用 awk 命令
awk 命令可以用来对文本进行分割、筛选、统计等操作,它的使用也非常简单,如下所示:
awk '/pattern/ { action }' file
其中 pattern 表示要匹配的正则表达式,action 表示匹配成功后要执行的操作,file 表示要处理的文件。
例如,查找文件 test.txt 中长度大于 10 的行:
awk 'length > 10' test.txt
- 使用 sed 命令
sed 命令可以用来进行匹配和替换操作,它的使用也非常简单,如下所示:
sed 's/pattern/replacement/' file
其中 pattern 表示要匹配的正则表达式,replacement 表示用来替换匹配文本的字符串,file 表示要处理的文件。
例如,将文件 test.txt 中的所有空格替换为下划线:
sed 's/ /_/g' test.txt
结论
Shell 正则表达式是一种非常常用的工具,在字符串匹配、搜索、替换和截取方面有着广泛的应用。熟练掌握正则表达式的语法和使用方法,可以极大地提高脚本编写的效率和质量。