【问题标题】:How to match regexp with ash?如何将正则表达式与灰匹配?
【发布时间】:2014-01-27 10:51:46
【问题描述】:

以下代码适用于 bash,但现在我需要它用于 busybox ash ,它显然没有“=~”

keyword="^Cookie: (.*)$"
if [[ $line =~ $keyword ]]
then
bla bla
fi

有合适的替代品吗?

抱歉,如果这是超级用户问题,无法决定。

编辑:也没有 grep、sed、awk 等。我需要纯 ash。

【问题讨论】:

  • 哇,没有 POSIX。只是出于好奇,你在什么系统上运行?

标签: regex busybox ash


【解决方案1】:

对于 this 特定的正则表达式,您可能会使用parameter expansion hack:

if [ "$line" = "Cookie: ${line#Cookie: }" ]; then
    echo a
fi

或者pattern matching notation + case hack:

case "$line" in
    "Cookie: "*)
        echo a
    ;;
    *)
    ;;
esac

但是,这些解决方案的功能确实不如 regexes,因为它们没有真正的 Kleene 明星 *(只有 .*),您应该真的获得一些更强大的工具(真正的编程像 Python 这样的语言?)安装在那个系统上,否则你受苦。

【讨论】:

  • 感谢这项工作。正如你所说,它非常有限。它是一个空间很小的路由器,无法安装 perl 或 python。可以试试 C.
【解决方案2】:

Busybox 带有一个expr 小程序,它可以进行正则表达式匹配(锚定到字符串的开头)。如果正则表达式匹配,则其返回码将为 0。示例:

 # expr "abc" : "[ab]*"
 # echo $?
 0
 # expr "abc" : "[d]*"
 # echo $?
 1

【讨论】:

    【解决方案3】:

    对我有用的是使用 Busy Box 的 grepwc 实现:

    MATCHES=`echo "$BRANCH" | grep -iE '^(master|release)' | wc -l`
    if [ $MATCHES -eq 0 ]; then
     echo 'Not on master or release branch'
    fi
    

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多