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

如何通过Shell命令提取文件内多类型数值并存入变量

问题说明

现有如下格式的配置文件:

water
{
    nu              1.69e-3;
    rho             8;
}
vapour
{
    rho             2;
}
right
{
    type            zeroGradient 6;
    value           uniform (40 10 0);  

}

left
{
    value           uniform (0 5 0);    
}

需要从文件中提取1.69e-3、8、2、40、5五个值存入独立变量。目前已实现两个rho值的提取,对应变量rhol(值8)、rhog(值2),使用的命令如下:

rhol=`grep rho file | awk '{print $NF}' | sed -e 's/;//g' | head -1`
rhog=`grep -m2 rho file | awk '{print $NF}' | sed -e 's/;//g' | tail -n1`

当前遇到的问题是无法正确提取科学计数法格式的nu参数值1.69e-3,以及right、left配置块中value字段对应的40、5两个值,需要可落地的实现方案。

实现方案

原有提取rho的逻辑存在隐患:如果文件后续新增其他带rho的配置项,会出现匹配错位。更稳妥的方式是用awk的区间匹配能力,先锁定对应配置块的范围,再在块内提取目标字段,完全避免跨块匹配错误,同时兼容科学计数法、带括号/分号的特殊行格式。

各字段提取命令

  • 提取nu参数值(1.69e-3):锁定water配置块,匹配nu字段后删除行尾分号取值
nu_val=$(awk '/^water$/,/^}/{if(/nu/){gsub(";","");print $NF}}' 你的文件路径)
  • 提取right块value的第一个值(40):锁定right配置块,匹配value行后删除括号、分号特殊字符,取uniform后的第一个数值
right_val=$(awk '/^right$/,/^}/{if(/value/){gsub(/[;()]/,"");print $3}}' 你的文件路径)
  • 提取left块value的第二个值(5):锁定left配置块,匹配value行后删除特殊字符,取对应位置的数值
left_val=$(awk '/^left$/,/^}/{if(/value/){gsub(/[;()]/,"");print $4}}' 你的文件路径)

完整提取脚本

可以把所有变量的提取统一替换为区间匹配逻辑,稳定性更高:

# 替换为实际文件路径
target_file="./test.txt"

# 提取water块nu值
nu_val=$(awk '/^water$/,/^}/{if(/nu/){gsub(";","");print $NF}}' "$target_file")
# 提取water块rho值(替换原有rhol提取逻辑)
rhol=$(awk '/^water$/,/^}/{if(/rho/){gsub(";","");print $NF}}' "$target_file")
# 提取vapour块rho值(替换原有rhog提取逻辑)
rhog=$(awk '/^vapour$/,/^}/{if(/rho/){gsub(";","");print $NF}}' "$target_file")
# 提取right块value第一个值
right_val=$(awk '/^right$/,/^}/{if(/value/){gsub(/[;()]/,"");print $3}}' "$target_file")
# 提取left块value第二个值
left_val=$(awk '/^left$/,/^}/{if(/value/){gsub(/[;()]/,"");print $4}}' "$target_file")

# 打印结果验证
echo "nu: $nu_val"
echo "rhol: $rhol"
echo "rhog: $rhog"
echo "right_value: $right_val"
echo "left_value: $left_val"

执行后输出结果为:

nu: 1.69e-3
rhol: 8
rhog: 2
right_value: 40
left_value: 5

问题原因说明

之前提取失败的核心原因有两个:

  1. 提取nu时如果用全局grep匹配,没有限定在water块内,且没有处理可能存在的字段误匹配问题,实际上awk对科学计数法格式的字符串可以正常读取,不存在格式兼容问题
  2. 提取value字段时全局匹配会同时拿到right和left两个块的value行,且行内包含括号、分号特殊字符,直接取最后一个字段会拿到带符号的错误内容,也无法区分值属于哪个配置块

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:45:49