Remove e substitui entre duas strings específicas usando o comando sed

1

Oi eu tenho um arquivo SQL que eu queria remover as declarações de processo que estão presentes em uma única linha, bem como as declarações de casos que estão presentes em várias linhas. Por exemplo, meu arquivo de entrada é:

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

Na minha saída, deve ser

Select a,
b,
c,
e as e
f,
g,
h,
i as i
FROM ABCD

Estou usando o comando sed

sed -i 's/\bCASE\b.*\bEND\b/${FIELD}/' $FILE

mas isso está funcionando apenas para a instrução case e end que estão em uma única linha Eu quero fazer com que funcione para instruções case e end que também são múltiplas linhas.

    
por Priyanka 30.04.2015 / 12:34

1 resposta

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]\)//
    }'

Com o GNU sed (que você parece estar usando), isso pode ser simplificado para:

sed -E '/case when/I{
          :1
          /end as/I!{
            N;b1
          }
          s/case when ([^ ]*).*end( as)//I
         }'

(que não assume mais do que uma instrução case em uma única linha).

Seria muito mais fácil com perl :

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

(note que esse comando absorve toda a entrada na memória, o que pode ser uma preocupação para arquivos enormes).

    
por 30.04.2015 / 13:28

Tags