sed - 只出现一次

Roo*_*asa 2 sed text-processing

我正在使用以下 SED 命令:

sed '/cell.* '"alatch {"'/,/^}/p' -n file
Run Code Online (Sandbox Code Playgroud)

输入文件如下:

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
    }
}


Run Code Online (Sandbox Code Playgroud)

输出如下:

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
    }
}

Run Code Online (Sandbox Code Playgroud)

预期如下:

cell alatch { 
    pins on T {
        VSS VDDPI VDDP
    }
    pins on L {
        IN CT CB
    }
    pins on R {
        OUT
    }
    inputs {
        CB CT IN
    }
    outputs {
        OUT
    }
}
Run Code Online (Sandbox Code Playgroud)

需要的是只有第一次出现应该是输​​出。命令有什么建议吗?

Kus*_*nda 5

假设您想要两个相同块中的第一个

$ 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
    }
}
Run Code Online (Sandbox Code Playgroud)

/cell alatch {/,/^}/范围是,你希望得到尽可能输出线的范围。

sed表达式首先删除所有行在此范围内,然后退出作为一旦}在一个行的开始找到。该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
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,这更接近sed命令

sed -n '/cell alatch {/,/^}/{ p; /^}/q; }' file
Run Code Online (Sandbox Code Playgroud)

它做同样的事情。