regex - 为什么带有 =~ 的 bash 正则表达式不能正常工作

标签 regex bash

以下代码不起作用

#!/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/

相关文章:

Java正则表达式将带引号的字符串与嵌入的转义引号相匹配

javascript - 获取字符串的一部分

php - 如何从 php 文件启动/停止 linux 上的应用程序?

windows - Windows 版 Git 不知道 %USERPROFILE%

c - 使用 "Bash on Ubuntu on Windows"编译的 C 脚本是否比在 Windows 中直接编译和运行慢?

linux - 删除文件中模式之间所有出现的某些字符

c++ - 寻找有关选择解析邮箱的算法的输入

JavaScript 正则表达式计算空格,但不计算制表符或回车符

Python 正则表达式反向引用命名组

Linux bash printf 格式,颜色分配给变量