使用 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/
    }'

使用 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'

(请注意,该命令会占用内存中的整个输入,这可能是大文件的问题)。

相关内容