如何用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
相关产品推荐
相关产品推荐

