如果语句不起作用,则在Bash中使用正则表达式匹配

时间:2018-02-16 05:40:50

标签: regex linux bash shell

下面是我正在研究的更大脚本的一小部分,但下面给了我很多痛苦,导致一部分较大的脚本无法正常运行。目的是检查变量是否具有匹配red hatRed Hat的字符串值。如果是,则将变量名称更改为redhat。但它与我使用过的正则表达式并不完全匹配。

getos="red hat"
rh_reg="[rR]ed[:space:].*[Hh]at"
if [ "$getos" =~ "$rh_reg" ]; then
  getos="redhat"
fi
echo $getos

非常感谢任何帮助。

2 个答案:

答案 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