【问题标题】:Regex - validate IPv6 shell script正则表达式 - 验证 IPv6 shell 脚本
【发布时间】:2017-08-08 10:11:57
【问题描述】:

我能够使用带有以下正则表达式的 java 验证 IPv6 地址:

([0-9a-fA-F]{0,4}:){1,7}([0-9a-fA-F]){0,4}

但我需要在我不熟悉的 shell 脚本中执行此操作。

这个正则表达式似乎在 shell 中不起作用。也尝试了其他一些组合,但没有任何帮助。

#!/bin/bash
regex="([0-9a-fA-F]{0,4}:){1,7}([0-9a-fA-F]){0,4}"
var="$1"

if [[ "$var" =~ "$regex" ]]
then
        echo "matches"
else
        echo "doesn't match!"
fi

它为 2001:0Db8:85a3:0000:0000:8a2e:0370:7334

提供输出 不匹配!

如何在 shell 脚本中编写这个?

【问题讨论】:

  • 相同的正则表达式应该可以工作。你能显示你的shell脚本代码吗?
  • 已将脚本添加到问题中。
  • 你也应该锚定你的正则表达式:regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$'
  • 我可以建议您重新编辑并保留原始错误吗?否则这个问题就没有意义了,有类似问题的读者可能会感到困惑。
  • @anubhava 请回答,我会接受的。

标签: regex bash shell


【解决方案1】:

有问题的 Java 正则表达式也可以在 bash 中工作,但请确保不要使用带引号的正则表达式变量。如果 =~ 运算符右侧的变量或字符串被引用,则将其视为字符串文字而不是正则表达式。

我还建议在正则表达式中使用锚点。否则它将为无效输入打印匹配项:2001:0db8:85a3:0000:0000:8a2e:0370:7334:foo:bar:baz

以下脚本应该适合您:

#!/bin/bash

regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$'
var="$1"

if [[ $var =~ $regex ]]; then
    echo "matches"
else
    echo "doesn't match!"
fi

【讨论】:

  • 1:1:1:1 是有效 IP 吗?
  • 在这个问题的上下文中,是的
【解决方案2】:

[[=~ 不能与 sh 一起使用,而 awk 几乎可以在任何地方使用。 这就是我所做的

另存为./check-ipv6.shchmod +x ./check-ipv6.sh

#!/bin/sh

regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$'
echo -n "$1" | awk '$0 !~ /'"$regex"'/{print "not an ipv6=>"$0;exit 1}'

或者你更喜欢 bash 而不是 sh

#!/bin/bash

regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$'
awk '$0 !~ /'"$regex"'/{print "not an ipv6=>"$0;exit 1}' <<< "$1"

测试

~$ ./check-ipv6.sh 2001:0Db8:85a3:0000:0000:8a2e:0370:7334x
not an ipv6=>2001:0Db8:85a3:0000:0000:8a2e:0370:7334x
~$ echo $?
1

~$ ./check-ipv6.sh 2001:0Db8:85a3:0000:0000:8a2e:0370:7334
~$ echo $?
0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2012-04-28
    • 2016-06-06
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多