【问题标题】:Bash regular expression groups not workingBash 正则表达式组不起作用
【发布时间】:2014-01-01 13:54:03
【问题描述】:

我正在尝试在我的 bash 脚本中进行模式匹配,但由于某种原因,我的组没有设置 BASH_REMATCH 变量。

代码如下:

if [[ "SYSENV01" =~ ^(SYS)(ENV)(01)$ ]]; then
    echo ${BASH_REMATCH[0]}        
    echo ${BASH_REMATCH[1]}
    echo ${BASH_REMATCH[2]}
fi

奇怪的是,这会打印出 SYSENV01,然后是 2 个空行到命令行 - 所以它必须是匹配的;但是,这些组没有出现。

有什么想法吗?这让我在圈子里转了好久。

【问题讨论】:

  • 您使用的是什么版本的 bash?该代码在 bash 4.2.45 中运行良好
  • Bash 版本:GNU bash,版本 4.1.7(1)-release (ia64-hp-hpux11.31)
  • 确保您使用的是 bash(可使用 #!/bin/bash 执行)或使用 bash filename 运行它。否则它可能正在使用另一个解释器(这不适用于 zshdash
  • 是的 - 在我的文件顶部得到了它,当我从 bash shell 尝试时它仍然不起作用。即[[ "SYSENV01" =~ ^(SYS)(ENV)(01)$ ]] && echo ${BASH_REMATCH[1]} - 但是 BASH_REMATCH[0] 有效
  • @user2294382 你确定你使用的是 bash 吗? echo $SHELL 说什么?

标签: regex bash shell scripting


【解决方案1】:

我同意评论者的观点……这可能是本地 shell 问题。这是我在本地得到的:

test.sh

#!/bin/bash
if [[ "SYSENV01" =~ ^(SYS)(ENV)(01)$ ]]; then
    echo ${BASH_REMATCH[0]}        
    echo ${BASH_REMATCH[1]}
    echo ${BASH_REMATCH[2]}
fi

输出:

~/tmp › sh ./test.sh
SYSENV01
SYS
ENV

Bash 版本信息:

~/tmp › bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

效率不高,但使用cut 也是一样的:

FIRST=$(echo "SYSENV01"  | cut -c1-3 )
SECOND=$(echo "SYSENV01" | cut -c4-6 )
THIRD=$(echo "SYSENV01"  | cut -c7- )

echo $FIRST
echo $SECOND
echo $THIRD

也许你可以改用类似的东西?

【讨论】:

  • 感谢您回复我。 Bash 不是我的默认 shell,ksh 是,但我在登录服务器后输入 bash。我的脚本引用了顶部#!/usr/local/bin/bash 的bash 可执行文件。但是,脚本输出对我来说不一样!想不出来这个。
  • 您使用的是 HP-UX,它因非标准而臭名昭著(我曾多年担任 HP-UX 管理员)。能不能用其他工具,比如cut来解析?
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多