以下代码不起作用
#!/usr/bin/env bash
line=" 12345 file /my/path"
[[ $line =~ ^\s*(\S*)\s+(\S*)\s+(\S*) ]]
var1=${BASH_REMATCH[1]}
var2=${BASH_REMATCH[2]}
var3=${BASH_REMATCH[3]}
echo $var1
echo $var2
echo $var3
我期望输出是
12345
file
/my/path
但是我得到了空输出
但是,如果我按如下方式更改代码,它就会按预期工作。
#!/usr/bin/env bash
line=" 12345 file /my/path"
re='^\s*(\S*)\s+(\S*)\s+(\S*)'
[[ $line =~ $re ]]
var1=${BASH_REMATCH[1]}
var2=${BASH_REMATCH[2]}
var3=${BASH_REMATCH[3]}
echo $var1
echo $var2
echo $var3
我尝试通过阅读 bash manual 来理解它。但我仍然不明白为什么要这样做。有人可以帮我解释一下吗?
最佳答案
\s
和 \S
不是 ERE 标准的一部分。
为了获得最大的兼容性,您的正则表达式应编写为:
[[ $line =~ ^[[:space:]]*([^[:space:]]*)[[:space:]]+([^[:space:]]*)[[:space:]]+([^[:space:]]*) ]]
也就是说,在 bash
中可以通过以下方式轻松完成空格分割并丢弃前导/尾随空格:
read -r var1 var2 var3 <<<"$line"
关于regex - 为什么带有 =~ 的 bash 正则表达式不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77596589/