为什么这个正则表达式不起作用?

Wil*_*den 3 bash regular-expression

我想查看 的输出git status -s以确定树中是否有任何未跟踪的文件。我尝试了以下测试,但正则表达式不匹配。为什么不?

$ git status -s
## master
 M updated-file
?? new-file
$ [[ $(git status -s) =~ ^\?\? ]] || echo "no match"
no match
Run Code Online (Sandbox Code Playgroud)

我还希望能够以相同的方式测试添加/修改/删除的文件。我通常只是^\s*[AMD]为此目的使用类似的东西,但这也不起作用。是什么赋予了?

Chr*_*own 5

您正在匹配整个字符串,而不是字符串的每一行,因此您实际上是##在该正则表达式中进行测试。

grep 是更好的选择:

if ! git status -s | grep -q '^??'; then
    echo "no match"
fi
Run Code Online (Sandbox Code Playgroud)

根据要求,您可以对添加/修改/删除执行相同操作:

git status -s | grep '^ *[AMD]'
Run Code Online (Sandbox Code Playgroud)

您可能还想查看git status --porcelain(首次出现在 1.7.0 中的选项),它更侧重于解析。