【发布时间】:2024-01-19 06:01:01
【问题描述】:
我正在尝试使用传递到grep 的 PCRE 正则表达式为反编译的 DTS 文件使用捕获组输出节点。我只对key-samkey {(...)}; 节点感兴趣。
关于我可能做错了什么的任何想法,或者您能指出任何替代方法来提取节点及其内容吗?我不能使用bash 的=~ 运算符,因为要求我们只使用sh。
我尝试了模式:
/(key-samkey {[.]*.+?[.]*};)/s
(key-samkey {[\s\S]*.+?(?=};))
我使用的确切命令是:
cat {input file} | grep -Po "{pattern}"
这两种模式似乎都可以在具有 PCRE 语法的在线正则表达式测试网站上正常工作,但在从 shell 执行时会失败。
我正在运行模式匹配的文件的结构如下:
/dts-v1/;
/ {
signature {
key-samkey {
required = "conf";
algo = "sha256,rsa4096";
rsa,r-squared = <xxxxxxxx>;
rsa,modulus = <xxxxxxxx>;
rsa,exponent = <0xxx 0xxxxxx>;
rsa,n0-inverse = <0xxxxxxxxx>;
rsa,num-bits = <0xxxxx>;
key-name-hint = "samkey";
};
};
};
【问题讨论】:
-
grep 是一个面向行的工具。改用适当的解析器
-
你可以试试(虽然不安全)
grep -Poz 'key-samkey\s*{[^{}]*}' file。见ideone.com/5VbWqZ -
为什么投反对票?如果您认为它可以以比
grep更好的方式完成,请解释。它始终是一个带有单个节点的简单文件,并在一个 shell 脚本中使用,该脚本可以自动执行迄今为止手工完成的操作。我认为进行“正确”解析对于这项任务来说是多余的。