使用正则表达式的 Bash 变量替换无法按预期工作

Osc*_*rro 3 regex bash substitution

给定一个包含以下字符串的 bash 变量:

INPUT="Cookie: cf_clearance=foo; __cfduid=bar;"
Run Code Online (Sandbox Code Playgroud)

为什么替换会${INPUT/cf_clearance=[^;]*;/}产生输出:Cookie: 而不是我所期望的:Cookie: __cfduid=bar;

在在线正则表达式验证器中测试相同的正则表达式确认cf_clearance=[^;]*;应该cf_clearance=foo;只匹配,而不是字符串的其余部分。

我在这里做错了什么?

che*_*ner 7

使用实际的正则表达式匹配功能而不是参数扩展,后者适用于模式。

[[ $INPUT =~ (.*)(cf_clearance=[^;]*;)(.*) ]]
ans=${BASH_REMATCH[1]}${BASH_REMATCH[3]}
Run Code Online (Sandbox Code Playgroud)

您还可以使用扩展模式,它相当于一个强大的正则表达式:

shopt -s extglob
$ echo "${INPUT/cf_clearance=*([^;]);/}"
Run Code Online (Sandbox Code Playgroud)