【问题标题】:Regex and if in shell script正则表达式和如果在 shell 脚本中
【发布时间】:2013-08-17 20:42:40
【问题描述】:

我的程序启动一些服务并将其输出存储在tmp 变量中,如果它以FATAL 关键字开头,我想匹配变量的内容?如果它包含我将使用echo 命令打印Port in use

例如,如果tmp 包含FATAL: Exception in startup, exiting.

我可以通过sedecho $tmp | sed 's/^FATAL.*/"Port in use"/' 来实现

但我想使用内置的if 来匹配模式。 如何使用 shell 内置功能匹配 REGEX?

【问题讨论】:

  • stackoverflow.com/questions/12142092/…if [[ $tmp =~ ^FATAL.* ]]; then echo "a"; else echo "b"; fi
  • 哪个外壳? bash 的答案将不同于 cshdash 的答案,也可能来自 ksh。例如,@Sithsu 的评论适用于bashcase 的答案将适用于从 Bourne/POSIX shell(不是 C shell 衍生品)派生的 shell。
  • 虽然这个问题更早出现,但这个问题已经收集了更多答案:stackoverflow.com/questions/21115121/…。如果您不想要bash-isms,那就是要解决的问题。 bash 有自己的模式匹配工具。

标签: regex shell sed ksh


【解决方案1】:

POSIX shell 没有用于 UNIX ERE 或 PCRE 的正则表达式运算符。但它确实有case keyword:

case "$tmp" in
  FATAL*) doSomethingDrastic;;
  *) doSomethingNormal;;
esac

你没有标记问题bash,但如果你有那个shell,你可以做一些其他类型的模式匹配甚至ERE:

if [[ "$tmp" = FATAL* ]]; then
    …
fi

if [[ $tmp =~ ^FATAL ]]; then
    …
fi

【讨论】:

  • 第二个和第三个答案有什么区别?
  • @M_E 第二个答案使用类似于test 命令的[[ 关键字,但具有额外的功能,包括case-like 模式匹配。第三个答案使用 ERE(扩展正则表达式)。
【解决方案2】:
if [ -z "${tmp%FATAL*}" ]
   then echo "Start with"
 else 
   echo "Does not start with"
 fi

在 AIX 下使用 KSH、BASH。觉得在Linux下也可以。

不是真正的正则表达式,而是用于文件匹配的有限正则表达式(在 shell 内部,不像 sed/grep/... 内部有自己的版本)。所以 * 和 ?可以用

【讨论】:

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