regex - FreeBSD Bash - 无法使用正则表达式编写条件

标签 regex bash freebsd

我正在尝试为基于 FreeBSD 的 pfSense 编写一个脚本。唯一给我带来麻烦的部分是正则表达式的条件。简化的代码是这样的:

RESPONSE='{"port":98989}'
REG='{"port":([0-9]*)}'
if [[ $RESPONSE =~ $REG ]]; then
    PORT=${BASH_REMATCH[1]}
fi

启用跟踪模式后,返回的错误如下:

+ RESPONSE='{"port":98989}'
+ REG='{"port":([0-9]*)}'
+ '[[' '{"port":98989}' '=~' '{"port":([0-9]*)}' ]]
./pia-port-v2: [[: not found

我不明白为什么 [[ 位于跟踪中的单引号之间,这可能就是发生“未找到”错误的原因。

更新

这可能是因为 pfSense 的 FreeBSD 不支持 bash,而这些指令仅适用于 bash。我在写完这个问题并试图找到答案后发现了这一点。

有人有 bourne shell 的替代品吗?目标是如果表达式匹配则返回端口号。

我是类 UNIX 操作系统中的脚本编码新手。

同时,我查看了 grep,但它似乎仅将正则表达式应用于文件输入。

最佳答案

您应该能够使用 expr utility执行此操作,但请注意它使用 Posix basic regexps ,这意味着您需要反斜杠括号才能将它们捕获:

response='{"port":98989}'
reg='{"port":\([0-9]*\)}'
port=$(expr "$response" : "$reg")

expr 如果正则表达式不匹配,则返回失败,因此您可以使用 shell 条件来测试:

port=$(expr "$response" : "$reg") || { echo Failed; }

if ! port=$(expr "$response" : "$reg"); then
  # Do something on failure
fi

关于regex - FreeBSD Bash - 无法使用正则表达式编写条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51116686/

相关文章:

bash - [[ 复合命令中未设置的参数是否预期为 bash 中的空字符串?

C# 到 Mono GetConsoleWindow 异常

c - 在内核中查找未知类型内存的大小

filesystems - 如何在ZFS中设置文件创建时间?

linux - 从文件列表中选择文件

freebsd - 如果 nohup.out 被删除,如何获取正在运行的 nohup 进程的输出

.net - Powershell中的正则表达式模式

c# - 使用 C# .Net 可被 60 整除的任何数字的正则表达式?

regex - 正则表达式匹配_或字符串结尾

java - 正则表达式电子邮件验证长度