行全体に対して単一の一致を処理する方法

行全体に対して単一の一致を処理する方法

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'

関連情報