Bash脚本无法检测指定开头模式的行问题排查
问题解决:Bash脚本无法匹配特定格式行
你的脚本匹配不到目标行的核心问题是正则表达式对开头空格的匹配范围不足,加上正则细节处理不到位,以下是具体修正方案:
问题分析
目标行 - id: 34开头有多个空格,但原正则^[[:space:]]仅匹配单个空格,导致无法匹配到开头带多空格的行。另外还需要避免ID被误匹配(比如把340当成34)。
修正后的脚本
#!/bin/bash id=34 # 逐行读取文件 while read line; do # 修正正则:适配多空格开头,同时限定ID的匹配边界 if [[ $line =~ ^[[:space:]]+-[[:space:]]id:[[:space:]]+$id([[:space:]]|$) ]]; then in_section=true echo "$line" fi done < file.txt
正则细节说明
^[[:space:]]+:匹配行开头的一个或多个空格(如果允许行首无空格,可替换为*)-:匹配连字符本身[[:space:]]:匹配连字符与id:之间的空格id:[[:space:]]+:匹配id:后一个或多个空格$id([[:space:]]|$):匹配目标ID,同时确保ID后是空格或行尾,避免误匹配更长的数字
更高效的替代方案(用grep)
如果不需要后续逐行处理逻辑,直接用grep可以简化操作:
id=34 grep -E "^[[:space:]]+-[[:space:]]id:[[:space:]]+$id([[:space:]]|$)" file.txt
内容的提问来源于stack exchange,提问作者Romby Soft
相关产品推荐
相关产品推荐

