![如何使用 zsh 正则表达式正确匹配换行符?](https://linux22.com/image/1472367/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20zsh%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%AD%A3%E7%A1%AE%E5%8C%B9%E9%85%8D%E6%8D%A2%E8%A1%8C%E7%AC%A6%EF%BC%9F.png)
对于我的提示,我尝试从命令的结果文本中解析当前 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
做 不是说 $
在正则表达式的末尾。