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

如何匹配跨两行的字符串?解决import telemetry检测问题

如何精准检测YANG文件中跨换行的import telemetry语句

看起来你已经碰到了grep跨行匹配的典型问题——要找的关键词被换行拆分了,同时还要避免误匹配无关内容。我来帮你梳理下可行的解决方案:

问题复盘

你最初的grep -Eq "import\s+telemetry"能搞定同一行内的空格/制表符分隔(也就是你提到的第1、2种场景),但对import和telemetry分两行的情况完全失效。而尝试的awk '/import/,/telemetry/'会把从第一个import到第一个telemetry之间的所有内容都匹配出来,范围太宽泛,很容易误判像import blah blah telemetry这种无关语句。

最优解决方案(你自己的脚本其实很靠谱!)

你写的这个脚本已经完美解决了问题:

#!/bin/sh
if grep -Pzq 'import[ \n\r\t]+telemetry' './xyz.yang'; then
    echo "This is a telemetry yang"
else
    echo "This is a normal yang"
fi

我来拆解下它为什么能精准匹配:

  • -P:启用Perl兼容正则表达式(PCRE),支持识别\n、\r这类换行/回车字符
  • -z:这个参数是关键——它会把整个文件当作一个以NULL字符结尾的"行",这样grep就能跨行匹配内容,不再局限于单行
  • 正则import[ \n\r\t]+telemetry:严格匹配import后面跟着一个或多个空白字符(空格、换行、回车、制表符),紧接着就是telemetry,完全不会匹配中间夹了其他内容的情况

兼容性备选方案(针对不支持grep -P的环境)

如果你的系统是BSD类(比如macOS),可能不支持grep -P,可以用awk实现同样的逻辑:

#!/bin/sh
if awk '
    /import/ {
        flag=1
        import_line=$0
        next
    }
    flag && /telemetry/ {
        # 拼接两行内容,检查是否符合空白分隔的规则
        if (import_line $0 ~ /import[ \t\n\r]+telemetry/) {
            exit 0
        }
        flag=0
    }
    END { exit 1 }
' ./xyz.yang; then
    echo "This is a telemetry yang"
else
    echo "This is a normal yang"
fi

这个awk脚本的逻辑是:

  1. 遇到包含import的行时,标记状态并保存该行内容
  2. 后续如果遇到包含telemetry的行,就把两行内容拼接起来,检查是否符合import和telemetry仅用空白字符分隔的规则
  3. 匹配成功就返回0,否则到脚本结束返回1

测试覆盖

这两个方案都能完美覆盖你列出的三种目标场景,同时会拒绝import blah blah telemetry这类误匹配情况,精准度拉满。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:58:38