Como remover Strings entre dois parênteses no Unix

2

Eu tenho um requisito como eu tenho que remover as seqüências de caracteres ou números entre dois parênteses em um arquivo. Eu usei o comando sed , mas ele está trabalhando em uma única linha. Meu parêntese de abertura está em uma linha e o parêntese de fechamento está em outra linha. Como posso fazer isso?

Eu tentei este comando usando sed :

sed -e 's/([^()]*)//g'

mas isso funciona somente quando Meus parênteses de abertura e fechamento estão na mesma linha.

Por exemplo: -

Arquivo de entrada:

select a
,b
,c
FROM ABCD
(select e
,f
,g
,h FROM XYZ)

O resultado deve ser:

select a
,b
,c
FROM ABCD
por Priyanka 14.04.2015 / 14:27

4 respostas

4

Use o seguinte script perl simples para remover todos os parênteses e seu conteúdo, mesmo em várias linhas:

#!/usr/bin/perl
undef $/;
$text = <>;
#Flags: g=match repeatedly; s=dot matches newline
$text =~ s/\(.*?\)//gs;
print $text;

Se você quiser encaixá-lo na linha de comando, aqui está a versão de uma linha:

perl -p0777e 's/\(.*?\)//gs' [filename]

Observe que ele é mais curto e simples do que as soluções perl. -0777 desativa o separador de linha (veja o -0 flag sob man perlrun ), fazendo com que todo o arquivo seja processado em uma única etapa. Good old perl ... Também é (incomum para perl :-)) mais legível do que brincar com o espaço padrão do sed.

    
por 15.04.2015 / 00:13
3

Para permanecer com a linha \n ew (se parênteses em duas linhas consequentes)

sed -e 's/\(^[^)]*) *\)\|([^)]*\() *\|$\)//g' filename

O script consiste em três padrões:

  • ^[^)]*) * da linha que começa com qualquer símbolo (s) exceto ) até ) com space(s) depois;
  • ([^)]* de ( qualquer símbolo (es) exceto )
    • até ) com space(s) depois; ou
    • até $ (fim da linha)

Para casos de várias linhas:

sed ':1;s/([^)]*)//g;/(/{N;b1};' filename
    
por 14.04.2015 / 14:44
2

Usando o Gnu Sed.

-z option (registros separados por nulo), o sed absorve toda a entrada como um único registro. Por favor, tente:

sed -ze 's/([^()]*)//g'
    
por 18.04.2015 / 14:24
1

Para correspondência de várias linhas com sed, é mais fácil ler o arquivo inteiro e fazer sua pesquisa / substituição em todo o conteúdo:

sed -n '            # disable auto-printing
  1h                # first line, move to hold space
  1!H               # not the first line, append to hold space
  ${                # at the end of file
    x               # move hold space to pattern space
    s/([^)]*)//gp   # perform search/replace and print
  }
' file

Existem opções mais simples (*):

awk -v RS="" '{gsub(/\([^)]+\)/,"")} 1' file
perl -0777 -pe 's/\(.*?\)//sg' file

(*) "mais simples" pode estar no olho de quem vê ...

    
por 14.04.2015 / 15:42

Tags