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

如何用Shell脚本读取ini格式配置文件并按条件输出内容

按分类提取文件内容的Shell脚本实现方案

针对你的需求,这里提供两种可行的Shell脚本实现方法,解决你使用while read未达预期的问题:

方法一:用awk快速实现(推荐)

awk处理这种分段文本非常高效,直接通过匹配分类标识控制内容输出:

提取指定分类内容

比如要提取Fruits下的内容,执行:

awk '/\[Fruits\]/{flag=1;next}/\[/{flag=0}flag' names.txt

提取Vegetables则替换成:

awk '/\[Vegetables\]/{flag=1;next}/\[/{flag=0}flag' names.txt

脚本逻辑说明

  • /\[Fruits\]/ 匹配到[Fruits]行时,设置标记flag=1,next跳过当前行不打印
  • /\[/{flag=0} 匹配到其他以[开头的分类行时,把标记设为0,停止输出
  • 最后的flag会在标记为1时自动打印当前行,也就是分类下的具体内容

可复用版本(通过变量指定分类)

如果需要频繁切换分类,可以把分类做成变量:

category="Fruits"
awk -v cat="$category" '/\['"$cat"'\]/{flag=1;next}/\[/{flag=0}flag' names.txt

方法二:改进while read循环实现

你之前用while read没成功,大概率是没正确处理分类切换的状态。以下是修正后的脚本:

#!/bin/bash
# 指定要提取的分类
target_category="Fruits"
# 控制是否输出内容的标记
show_content=0

# 逐行读取文件
while IFS= read -r line; do
    # 匹配目标分类的标识行(比如[Fruits])
    if [[ "$line" =~ ^\[$target_category\]$ ]]; then
        show_content=1
        continue
    fi
    # 匹配其他分类的标识行,关闭输出
    if [[ "$line" =~ ^\[.*\]$ ]]; then
        show_content=0
        continue
    fi
    # 标记为1时打印当前行
    if [ "$show_content" -eq 1 ]; then
        echo "$line"
    fi
done < names.txt

关键细节说明

  • IFS= read -r line 确保读取行时保留空格、特殊字符,避免内容被截断
  • 通过正则匹配分类行,精准控制内容输出的开关
  • 遇到新的分类行时立即关闭当前输出,避免跨分类输出错误内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:41:10