Shell 正则表达式

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 地址等:

  1. 匹配手机号
#!/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 位数字的字符串。

  1. 查询目录下的所有 .md 文件
#!/bin/bash

for file in ./*.md; do
  echo "$file"
done

上述代码利用了 ./*.md 正则表达式来匹配当前目录下的所有扩展名为 .md 的文件。

  1. 替换字符串中的数字
#!/bin/bash

string="abcd1234"

echo "替换前:string"

# 将字符串中的所有数字替换为 #
new_string=(echo "string" | sed 's/[0-9]/#/g')

echo "替换后:new_string"

上述代码利用了 s/[0-9]/#/g 正则表达式来将字符串中的所有数字替换为 #。

  1. 匹配 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 正则表达式使用技巧

在实际使用中,可以用一些技巧来简化正则表达式的书写和匹配过程。

  1. 使用 grep 命令

grep 命令可以用来从文件或标准输入中搜索指定的模式,并输出匹配的行。它的使用非常简单,如下所示:

grep pattern file

其中 pattern 表示要匹配的正则表达式,file 表示要搜索的文件。

例如,查找文件 test.txt 中包含单词 hello 的行:

grep hello test.txt
  1. 使用 awk 命令

awk 命令可以用来对文本进行分割、筛选、统计等操作,它的使用也非常简单,如下所示:

awk '/pattern/ { action }' file

其中 pattern 表示要匹配的正则表达式,action 表示匹配成功后要执行的操作,file 表示要处理的文件。

例如,查找文件 test.txt 中长度大于 10 的行:

awk 'length > 10' test.txt
  1. 使用 sed 命令

sed 命令可以用来进行匹配和替换操作,它的使用也非常简单,如下所示:

sed 's/pattern/replacement/' file

其中 pattern 表示要匹配的正则表达式,replacement 表示用来替换匹配文本的字符串,file 表示要处理的文件。

例如,将文件 test.txt 中的所有空格替换为下划线:

sed 's/ /_/g' test.txt

结论

Shell 正则表达式是一种非常常用的工具,在字符串匹配、搜索、替换和截取方面有着广泛的应用。熟练掌握正则表达式的语法和使用方法,可以极大地提高脚本编写的效率和质量。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程