Shell脚本中如何仅用BASH_REMATCH提取单词首字符?
仅用BASH_REMATCH提取大写单词首字符的解决方案
固定单词数量的实现
如果确定目标行只有三个大写单词,可直接用正则捕获每个单词的首字符,脚本如下:
# 正确赋值变量,Bash变量赋值时=前后不能有空格 var="config_text" # 读取包含目标变量的行 target_line=$(grep "$var" test_file.txt) # 用正则匹配等号后每个大写单词的首字符 if [[ $target_line =~ = ([A-Z])[A-Z]* ([A-Z])[A-Z]* ([A-Z])[A-Z]* ]]; then # 拼接捕获到的首字符 echo "${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}" fi
执行后会输出SOF,完全符合预期。
动态适配任意数量大写单词的实现
如果目标行的大写单词数量不固定,用循环配合正则逐步提取:
var="config_text" target_line=$(grep "$var" test_file.txt) # 截取等号之后的内容,聚焦到目标单词部分 word_section=${target_line#*= } result="" # 循环匹配每个大写单词,提取首字符 while [[ $word_section =~ ([A-Z])[A-Z]* ]]; do # 追加当前单词的首字符到结果 result+="${BASH_REMATCH[1]}" # 移除已匹配的单词,继续处理剩余内容 word_section=${word_section#*${BASH_REMATCH[0]}} done echo "$result"
关键说明
- 变量赋值修正:原代码中
var = config_text属于语法错误,Bash变量赋值时=前后不能有空格,必须写成var="config_text"。 - \b不生效原因:Bash的扩展正则表达式(ERE)不支持
\b作为单词边界,改用空格分隔的匹配逻辑更可靠,也规避了不同系统的兼容性问题。 - BASH_REMATCH数组:正则匹配后,
BASH_REMATCH[0]对应整个匹配的字符串,BASH_REMATCH[1]、BASH_REMATCH[2]等依次对应正则中括号包裹的捕获组内容。
内容的提问来源于stack exchange,提问作者Nabil Zouita
相关产品推荐
相关产品推荐

