你好,我有一个 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/
}'
使用 GNU sed
(您似乎正在使用),可以简化为:
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'
(请注意,该命令会占用内存中的整个输入,这可能是大文件的问题)。