sed 명령을 사용하여 두 개의 특정 문자열을 삭제하고 교체하십시오.

sed 명령을 사용하여 두 개의 특정 문자열을 삭제하고 교체하십시오.

안녕하세요. SQL 파일이 있는데 한 줄의 Case 문과 여러 줄의 Case 문을 삭제하고 싶습니다. 예를 들어 내 입력 파일은 다음과 같습니다.

Select a,
b,
c,
CASE when e in (1,0,2) then Y END as e
f,
g,
h,
CASE when i in (5,
6,
7,
9.
,10) then N
END as i
FROM ABCD

내 출력에서는 다음과 같아야합니다.

Select a,
b,
c,
e as e
f,
g,
h,
i as i
FROM ABCD

sed 명령을 사용하고 있습니다

sed -i 's/\bCASE\b.*\bEND\b/${FIELD}/' $FILE

그러나 이것은 한 줄의 case 및 end 문에만 작동하며, 여러 줄의 case 및 end 문에서도 작동하기를 원합니다.

답변1

sed '/[Cc][aA][sS][eE] [wW][Hh][Ee][Nn]/{
      :1
      /[eE][nN][dD] [aA][sS]/!{
        N;b1
      }
      s/[Cc][aA][sS][eE] [wW][Hh][Ee][Nn] \([^ ]*\).*[eE][nN][dD]\( [aA][sS]\)/\1\2/
    }'

sed(사용 중인 것으로 보이는) GNU를 사용하면 다음과 같이 단순화할 수 있습니다.

sed -E '/case when/I{
          :1
          /end as/I!{
            N;b1
          }
          s/case when ([^ ]*).*end( as)/\1\2/I
         }'

( case한 줄에 하나 이상의 명령문이 없다고 가정).

다음 명령을 사용하는 것이 훨씬 쉽습니다 perl.

perl: perl -0777 -pe 's/case when (\w+) in.*?end as /$1 as /gis'

(이 명령은 전체 입력을 메모리에 저장하므로 대용량 파일의 경우 문제가 될 수 있습니다.)

관련 정보