You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

关键说明

  1. 变量赋值修正:原代码中var = config_text属于语法错误,Bash变量赋值时=前后不能有空格,必须写成var="config_text"。
  2. \b不生效原因:Bash的扩展正则表达式(ERE)不支持\b作为单词边界,改用空格分隔的匹配逻辑更可靠,也规避了不同系统的兼容性问题。
  3. BASH_REMATCH数组:正则匹配后,BASH_REMATCH[0]对应整个匹配的字符串,BASH_REMATCH[1]、BASH_REMATCH[2]等依次对应正则中括号包裹的捕获组内容。

内容的提问来源于stack exchange,提问作者Nabil Zouita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:25:32