Unix:如何判断字符串是否与正则表达式匹配

11

我正在尝试使用 fish shell,因此我正在翻译我的bash函数。问题在于,在某些情况下,我使用bash正则表达式来检查字符串是否匹配正则表达式。我无法弄清楚如何将其翻译成fish。

这里 是我的示例。

if [[ "$arg" =~ ^[0-9]+$ ]]
...

我研究了sed,但我没有看到它如何根据正则表达式是否匹配来设置其退出状态。
我研究了委托给Ruby,但是,要根据匹配设置退出状态需要使其变得非常丑陋(见下文)。
我研究了委托回bash,但尽管尝试了三四种方法,仍无法匹配。 那么,在*nix中有一种方法可以检查字符串是否与正则表达式匹配,以便我可以将其放入条件语句中吗? 以下是我目前使用的代码,但我对此不满意:
# kill jobs by job number, or range of job numbers
# example: k 1 2 5
# example: k 1..5
# example: k 1..5 7 10..15
# example: k 1-5 7 10-15
function k
  for arg in $argv
    if ruby -e "exit ('$arg' =~ /^[0-9]+\$/ ? 0 : 1)"
      kill -9 %$arg
    else
      set _start (echo "$arg" | sed 's/[^0-9].*$//')
      set _end   (echo "$arg" | sed 's/^[0-9]*[^0-9]*//')

      for n in (seq $_start $_end)
        kill -9 %"$n"
      end
    end
  end
end
3个回答

12

标准的做法是使用 grep 命令:

if echo "$arg" | grep -q -E '^[0-9]+$'
  kill -9 %$arg

谢谢!我甚至没有意识到有-E标志(总是使用awk),-q标志,或者它会根据是否看到匹配设置其退出状态。 - Joshua Cheek
在OS X上安装GNU grep以使用-P(Perl正则表达式语法)。 - xixixao

7
我建议使用内置的字符串匹配子命令string match
if string match -r -q  '^[0-9]+$' $arg
  echo "number!"
else
  echo "not a number"
end

-1

OP 知道他们正在迁移到其他 Shell,不再使用 Bash。 - Steve Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接