如何对整行的单场比赛进行操作

如何对整行的单场比赛进行操作

我有一个Verilog像这样的行:

如果 (i2_0&!(i2_1)) (posege i0_0 => (o:1'b1))=(0, 0);

我怎样才能将它转换成这样的行:

如果 (i2_0 == 1'b1 & i2_1 == 1'b0) (posege i0_0 => (o:1'b1))=(0, 0);

基本上,我想在 if 语句的第一个括号之后搜索字母数字字符串,并将括号或“&”之间的每个部分转换为其等效的逻辑语句。
例如:

(i2_0&变成(i2_0 == 1'b1 &

和:

!(i2_1))变成i2_1 == 1'b0)

在上面的例子中。

答案1

根据评论中的解释:

sed "
# for lines which starts with if
/^if\b/{
    /==/! {
        # add logic statement to first alphanums after ( 
        s/\((\w\+\)/\1 == 1b'1 /
        # add logic statement to second alphanums after & if it is present 
        s/\(&\!\?(\?\w\+\)/\1 == 1b'1 /
        # if ! sign in section replace 1 by 0 at the end of statement 
        s/\!(\([^']*'\)1 )/ \10 /g
          }
       }
" file

其他变体 - 删除除将要修改的部分之外的所有内容,更改它,然后构造完整的行:

sed "/^if\b/{
        /==/!{
            h
            s/if (.*) //
            x
            s/if (\(.*\)) (.*/\1/
            s/\w\+/& == 1'b1 /g
            s/!(\(.*\)1 )/ \10/g
            s/.*/if (&)/
            G
            s/\n/ /
             }
            }" file

答案2

也许是这样的:

perl -0777 -pe 's{\bif\s*\K\((([^()]++|\((?1)\))*)(?=\))}{
  $& =~ s{([&(])\s*(!?)\s*\(?(\w+\b)\)?(?!\s*(==|'\''))}{
   "$1$3 == 1'\''b".(0+!!$2)}gers}ges'

相关内容