【问题标题】:Simple Bash and RegEx Questions [duplicate]简单的 Bash 和 RegEx 问题 [重复]
【发布时间】:2011-11-18 07:24:54
【问题描述】:

我无法在 bash 4.1 中使用正则表达式正确匹配模式。我已经阅读了一些关于引号与非引号差异的信息,但我认为这不是我的问题。

我的目标是检查并确保为脚本提供了有效的 ID。在这种情况下,一个有效的 ID 是一个 9 位数字的字符串。据我了解,它的正则表达式是 \d{9}。鉴于这是我要检查的代码 sn-p:

id=$1       
if [[ $id =~ \d{9} ]]; then
     echo "This is a vaild ID"
else
     echo "This is not a vaild ID"
fi

然后调用脚本:

 ./script 987654321

我错过了什么明显的东西?

【问题讨论】:

  • 您应该编辑您的问题以包括您认为它不起作用的原因。你得到其他陈述了吗?还是您遇到语法错误。祝你好运。
  • Bash(v3 及更高版本)中的正则表达式不支持\d,您可以使用[0-9][:digit:] posix 字符类。
  • 完全可移植的方式是使用 glob 模式,即case $id in [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) echo fine ;; *) die in anguish;; esac

标签: regex bash bash4


【解决方案1】:

这将起作用:如果 [[ $id =~ [[:digit:]]{9} ]] – David W. 11 小时前


@David 我在 bash 上尝试过,但似乎没有用。 – Vivin Paliath 10 小时前


我刚刚写了一个测试程序:

#! /bin/bash

for id in 123456789 12345689 1234567890 987654321
do
    if [[ $id =~ ^[[:digit:]]{9}$ ]]
    then
        echo "$id is 9 digits long"
    else
        echo "$id is bad"
    fi
done

我得到以下输出:

DaveBook:~ david$ ./test.sh
123456789 is 9 digits long
12345689 is bad
1234567890 is bad
987654321 is 9 digits long
DaveBook:~ david$ 

我在 Mac OS X 上使用 BASH 3.2.48,在 Cygwin 上使用 Bash 4.1.10(4)(哇,Mac 版本那个旧了?)。我还没有在 Linux 机器上测试过。

你用的是什么版本?您是否将:digit: 周围的方括号加倍?它必须是[[:digit:]] 而不是[:digit:]

我还意识到我需要^$ 锚点,因为你不想匹配foo123456789bar1234567890123456790。这是您遇到的问题吗?

问题是[[:digit:]] 应该已经工作了。我在许多 Bash shell 脚本中使用过它,认为它相当通用。但是,如果您的 BASH shell 无法正常工作,我将不得不停止使用它。

【讨论】:

  • 我不知道我之前抽的是什么烟,但我现在试了一下,效果很好。我可以发誓上次尝试时它没有用,因为这是我尝试的第一件事。
  • 这就是我想要的,谢谢。您是否有参考文章来查找 /d 和 [[:digit:]] 等项目之间的等价性,或者手册页是最好的资源吗?
  • 其实最好的来源是 Perl 文档。毕竟,所有扩展正则表达式的东西最初都来自 Perl。看看perldoc perlre 和关于字符类的部分。
  • 非常感谢!但是,您将如何指定最多 9 位的数字?
【解决方案2】:

正如其他人已经回答的那样,您应该使用[0-9]{9},因为不支持\d。但另一个重要部分是,您必须使用锚点!

^[0-9]{9}$

^ 将正则表达式锚定到字符串的开头,$ 将其锚定到末尾。如果您不使用它们,您的正则表达式将匹配每个包含 9 位数字的字符串,例如“abc123456789”、“asdf123456789zui”或“123456789FOOBAR”。

【讨论】:

  • 为什么要在 :digit: 周围加上 [[ 和 ]]?
【解决方案3】:

试试这个:

if [[ $id =~ [0-9]{9} ]]; then

看来 bash 无法将 \d 识别为 [0-9]

Bash usesExtended Regular Expression dialect,不支持\d

根据 ERE 的语法(词汇约定),转义字符的格式为 \SPEC_CHARSPEC_CHAR 可以是以下任意一种:

^    .    [    $    (    )    |
*    +    ?    {    \

【讨论】:

  • @David 我测试了它,它现在可以工作了。我不知道为什么我第一次尝试它时它不起作用。
【解决方案4】:

问题是 \d 在被解释之前变成了 d 。尝试双重转义。

\d{9} => d{9}
\\d{9} => \d{9}

或者,你可以把它放在引号中

if [[ $id =~ "\d{9}" ]]

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-10-04
    • 2011-07-19
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多