sed コマンドを使用して、2 つの特定の文字列を削除して置き換えます。

sed コマンドを使用して、2 つの特定の文字列を削除して置き換えます。

こんにちは。 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
         }'

case1行に1つ以上のステートメントがないとします)。

次のコマンドを使用する方がはるかに簡単ですperl

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

(このコマンドは入力全体をメモリに保存するため、大容量ファイルの場合は問題になる可能性があります。)

おすすめ記事