안녕하세요. 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'
(이 명령은 전체 입력을 메모리에 저장하므로 대용량 파일의 경우 문제가 될 수 있습니다.)