【bash】bash-12 正则表达式

【bash】bash-12 正则表达式
最新回答
心比柠檬酸

2026-10-28 00:24:09

在bash-12中,正则表达式用于文本搜索、匹配和操作,其核心由元字符、限定符、字符类等构成,可通过组合实现复杂匹配规则。 以下是具体说明:

  • 基本元字符

    ^:匹配行起始位置。例如^tux仅匹配以tux开头的行。

    $:匹配行尾位置。例如tux$仅匹配以tux结尾的行。

    .:匹配任意单个字符(除换行符)。例如hack.匹配hackl、hacki,但不匹配hackla。

    []:匹配括号内任意一个字符。例如coo[kl]匹配cook或cool;[^01]匹配非0和1的字符(如9[^01]匹配92)。

    [-]:匹配指定范围内的字符。例如[1-5]匹配1到5的数字;[a-z]匹配任意小写字母。

  • 限定符

    ?:匹配前一项0次或1次。例如colou?r匹配color或colour,但不匹配colouur。

    +:匹配前一项1次或多次。例如col+匹配col、coll,但不匹配co。

    *:匹配前一项0次或多次。例如co*l匹配cl、cool、coool等。

    {n}:精确匹配前一项n次。例如[0-9]{3}匹配任意三位数(如123)。

    {n,}:匹配前一项至少n次。例如[0-9]{3,}匹配三位数或更长的数字(如1234)。

    {n,m}:匹配前一项n到m次。例如[0-9]{2,5}匹配两位到五位数字(如99或12345)。

  • 分组与交替

    ():将多个字符组合为一个整体。例如ma(tri)?x匹配max或matrix。

    |:匹配左右任意一侧的表达式。例如Oct(1st|2nd)匹配Oct1st或Oct2nd。

  • 转义符

    :转义特殊字符,使其作为普通字符匹配。例如a.b匹配a.b(而非a后跟任意字符再跟b)。

  • POSIX字符类以[: :]形式定义,匹配特定字符范围:

    [:alnum:]:字母或数字(等价于[a-zA-Z0-9])。

    [:alpha:]:字母(大小写均包含)。

    [:blank:]:空格或制表符。

    [:digit:]:数字(等价于[0-9])。

    [:lower:]:小写字母。

    [:upper:]:大写字母。

    [:punct:]:标点符号。

    [:space:]:所有空白字符(包括换行符、回车等)。

    示例:

    匹配三位数:[[:digit:]]{3}或[0-9]{3}。

    匹配单词(含大小写):[[:alpha:]]+。

  • 常见应用场景

    电子邮件匹配:

    ^[a-z0-9_]+@[a-z0-9]+.[a-z]+$

    匹配形如user@example.com的邮箱地址(需根据实际需求扩展,如支持大写字母或更多域名层级)。

    单词提取:

    ( ?[a-zA-Z]+ ?)

    匹配文本中的单词(前后可能有空格),例如从" hello world "中提取hello和world。

    IP地址验证:

    ^([0-9]{1,3}.){3}[0-9]{1,3}$

    或使用POSIX字符类:

    ^([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}$

    匹配0.0.0.0到255.255.255.255的IP地址(需注意:此正则未严格限制每段数值范围,实际需更复杂规则)。

注意事项:

  • Bash正则表达式默认区分大小写,可通过shopt -s nocasematch临时启用不区分大小写模式(仅影响[[ ]]条件判断)。
  • 不同工具(如grep、sed、awk)对正则的支持可能略有差异,例如grep -E启用扩展正则表达式以支持+、?等符号。
  • 复杂场景建议结合grep、sed或awk使用,例如提取日志中特定格式的时间戳:grep -Eo '[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}' logfile.txt