sed - 只出现一次

sed - 只出现一次

我正在使用以下 SED 命令:

sed '/cell.* '"alatch {"'/,/^}/p' -n file

输入文件如下:

cell abc { 
    pins on T {
        a b c
    }
    
}
cell xyz { 
    pins on T {
        x y z
    }
    
}

cell alatch { 
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}
cell alatch { 
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}


输出如下:

cell alatch { 
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}
cell alatch { 
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}

预期输出如下:

cell alatch { 
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}

所需要的是只有第一次出现的情况才是输出。对指挥有什么建议吗?

答案1

假设你想要第一的两个相同的块:

$ sed '/cell alatch {/,/^}/!d; /^}/q' file
cell alatch {
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}

范围/cell alatch {/,/^}/是您想要作为输出获得的行的范围。

表达式sed首先删除所有行不是在此范围内,然后退出一旦}在行首找到 a 。该q指令将sed在输出当前行后终止,因此}将打印最后一行。

执行d指令立即地跳到下一个输入行并分支回编辑脚本的开头,因此q指令无法执行,除非它位于不会导致d执行的范围内。


使用awk,使用应该让人想起上面代码的代码实现相同的效果sed

$ awk '/cell alatch {/,/^}/ { print; if ($0 ~ /^}/) exit }' file
cell alatch {
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}

其实这个更接近sed命令

sed -n '/cell alatch {/,/^}/{ p; /^}/q; }' file

它做同样的事情。

答案2

awk我们积累所需的单元数据,当深度({=数量})达到0时,我们转储单元数据并退出。

awk '
  BEGIN { ORS = "" }
  /cell alatch \{/ {inCell=1}
  !inCell {next}
  {data = data $0 RS} 
  /\}/ {depth--} 
  /\{/ {depth++}
  !depth {
    print data 
    exit
  }
' ./file

使用GNU sed 与上面的 awk 代码的想法相同。

sed -e '
  /cell alatch {/!d
  /\n/!{h;s/.*/x/;x;}
  $d;N
  /}$/{x;s/x//;/x/!{x;q;};x;}
  /{$/{x;s/$/x/;x;}
  s/^/\n/;D
' file

相关内容