sed匹配含clk_a与clk_b的行写入文件失败,求排查问题
sed命令失效的原因及修正方案
你的sed命令无法正常工作,核心问题出在正则表达式的语法兼容上:
- sed默认使用基础正则表达式(BRE),你命令里的
|是扩展正则表达式(ERE)的分支匹配符(表示“或”逻辑),在BRE中它只是普通字符,不会被解析为分支逻辑。这导致你的正则实际上是在匹配包含clk_a.*clk_b|clk_b.*clk_a这个完整字符串的行,而非“同时包含clk_a和clk_b(不管顺序)”的行。
修正方案
这里提供三种可行的修正方式:
开启扩展正则模式
给sed加上-E(BSD/macOS sed)或-r(GNU sed)选项,启用扩展正则,让|生效:sed -n -E '/clk_a.*clk_b|clk_b.*clk_a/w OUTFILE' INFILE转义分支符适配基础正则
在BRE中,把|转义为\|,让它具备分支匹配功能:sed -n '/clk_a.*clk_b\|clk_b.*clk_a/w OUTFILE' INFILE更简洁的逻辑写法
不需要分支正则,先过滤掉不含clk_a的行,再筛选含clk_b的行,逻辑更清晰:sed -n '/clk_a/!d; /clk_b/w OUTFILE' INFILE解释:
/clk_a/!d会删除所有不包含clk_a的行,剩下的行里再匹配包含clk_b的,直接写入输出文件。
以上三种方式都能正确提取输入文件中前两行同时包含clk_a和clk_b的内容到OUTFILE中。
内容的提问来源于stack exchange,提问作者Jason Zhang
相关产品推荐
相关产品推荐

