下面是我正在研究的更大脚本的一小部分,但下面给了我很多痛苦,导致一部分较大的脚本无法正常运行。目的是检查变量是否具有匹配red hat
或Red Hat
的字符串值。如果是,则将变量名称更改为redhat
。但它与我使用过的正则表达式并不完全匹配。
getos="red hat"
rh_reg="[rR]ed[:space:].*[Hh]at"
if [ "$getos" =~ "$rh_reg" ]; then
getos="redhat"
fi
echo $getos
非常感谢任何帮助。
答案 0 :(得分:7)
这里有很多事情需要解决
to_h
支持其response.each_header.to_h
{
"x-frame-options"=>"SAMEORIGIN",
"x-xss-protection"=>"1; mode=block",
"x-content-type-options"=>"nosniff",
"content-type"=>"application/json; charset=utf-8",
"etag"=>"W/\"51a4b917285f7e77dcc1a68693fcee95\"",
"cache-control"=>"max-age=0, private, must-revalidate",
"x-request-id"=>"59943e47-5828-457d-a6da-dbac37a20729",
"x-runtime"=>"0.162359",
"connection"=>"close",
"transfer-encoding"=>"chunked"
}
扩展测试运算符内的正则表达式模式匹配,而不支持其POSIX标准bash
测试运算符bash
3.2 introduced a compatibility option compat31
(under New Features in Bash 1.l)将bash正则表达式引用行为恢复为3.1,支持引用正则表达式字符串。[[
而不是[
所以就这样做
[[:space:]]
或从扩展shell选项
启用[:space:]
选项
getos="red hat"
rh_reg="[rR]ed[[:space:]]*[Hh]at"
if [[ "$getos" =~ $rh_reg ]]; then
getos="redhat"
fi;
echo "$getos"
但是不要乱用那些shell选项,只需使用带有不带引号的正则表达式字符串变量的扩展测试运算符compat31
。
答案 1 :(得分:4)
有两个问题:
首先,替换:
rh_reg="[rR]ed[:space:].*[Hh]at"
使用:
rh_reg="[rR]ed[[:space:]]*[Hh]at"
像[:space:]
这样的字符类只有在方括号中才有效。此外,您似乎希望匹配零个或多个空格,而[[:space:]]*
不是[[:space:]].*
。后者将匹配一个空格,后跟零或更多的任何东西。
其次,替换:
[ "$getos" =~ "$rh_reg" ]
使用:
[[ "$getos" =~ $rh_reg ]]
正则表达式匹配需要bash的扩展测试:[[...]]
。 POSIX标准测试[...]
没有此功能。另外,在bash中,正则表达式只有在不加引号时才有效。
$ rh_reg='[rR]ed[[:space:]]*[Hh]at'
$ getos="red Hat"; [[ "$getos" =~ $rh_reg ]] && getos="redhat"; echo $getos
redhat
$ getos="RedHat"; [[ "$getos" =~ $rh_reg ]] && getos="redhat"; echo $getos
redhat