如何使用 zsh 正则表达式正确匹配换行符?

如何使用 zsh 正则表达式正确匹配换行符?

对于我的提示,我尝试从命令的结果文本中解析当前 git 分支git status。例如,它返回:

On branch master
nothing to commit, working directory clean

因此,在我的 zsh 提示定义脚本中我有:

git_status="$(git status 2> /dev/null)"
$git_status =~ "^On branch (.*)$"
branch=$match[1]

但是当我回应-Variable时$branch,我得到:

master
nothing to commit, working directory clean

那么,为什么$正则表达式中的控制序列与分支名称后的换行符不匹配,并且为什么匹配会在两行上扩展?

答案1

在处理一行之前先使用 grep

git_status="$(git status 2> /dev/null | grep 'On branch')"
[[ $git_status =~ "^On branch (.*)$" ]]
echo $match[1]

$ zsh 测试.sh

掌握

我没能通过多线获得相同的结果,如果有人找到解决方案,我会很感兴趣地看看。

使用 zsh 5.3 测试

答案2

您可以使用

[[ $git_status =~ "anch ([[:graph:]]*)" ]]

或者

[[ $git_status =~ "anch ([[:print:]]*)" ]]

[[:graph:]]*将匹配一个单词(即,直到第一个空格、制表符或换行符的所有内容); [[:print:]]*将匹配该行的其余部分(即,直到换行符的所有内容)。

当然,如果您愿意,您可以说;我的观点是,如果您有充分信心结果会和您预期的一样,那么  ^On branch您不必这么说。$git_status做 不是说 $在正则表达式的末尾。

相关内容