전체 행에 대해 단일 일치 항목을 처리하는 방법

전체 행에 대해 단일 일치 항목을 처리하는 방법

나는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'

관련 정보