こんにちは。 SQLファイルがありますが、1行の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
しかし、これは1行の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
1行に1つ以上のステートメントがないとします)。
次のコマンドを使用する方がはるかに簡単ですperl
。
perl: perl -0777 -pe 's/case when (\w+) in.*?end as /$1 as /gis'
(このコマンドは入力全体をメモリに保存するため、大容量ファイルの場合は問題になる可能性があります。)