如何在if语句中捕获正则分组匹配并在匹配时使用分组内容
解决正则分组捕获统一主机名格式的问题
现有主机名列表
hostname1 Hostname2 hostname3 hostname10 Hostname21 hostname120
需求
将所有首字母为大写H的主机名转为小写h开头的格式,最终输出统一为:
hostname1 hostname2 hostname3 hostname10 hostname21 hostname120
修正后的脚本
if [[ "$(hostname)" =~ ^[Hh]ostname([0-9]{1,3})$ ]] then echo "hostname${BASH_REMATCH[1]}" else echo "$(hostname)" fi
关键说明
- 在Bash的
[[ ... =~ ... ]]正则匹配语法中,正则分组捕获的内容会自动存入BASH_REMATCH数组:BASH_REMATCH[0]对应整个匹配的完整字符串BASH_REMATCH[1]对应第一个括号分组捕获的数字部分
- 原脚本中使用的
$1是脚本的位置参数,并非正则分组的捕获内容,这是错误根源 - 通过直接拼接固定前缀
hostname和分组捕获的数字部分,就能实现统一格式的输出,不受原主机名首字母大小写影响
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

