“parênteses não balanceados” mesmo que eu tenha escapado dele?

7

Estou tentando executar este simples comando sed

sed '/VALUES\ \([0-9]/d!'

Ainda dá um erro dizendo "RE error: parentheses not balanced" (sim, as aspas estão lá).

O que posso fazer? Quer dizer, eu poderia apenas adicionar outro ) , mas não corresponderia ao meu regex.

    
por DisplayName 07.12.2014 / 16:53

3 respostas

10

O escape ( tem um significado especial em sed : é usado para referências anteriores . Para corresponder a um literal ( , basta usá-lo sem a barra invertida: /VALUES ([0-9]/d!

Se você está tentando corresponder \( , então escape do \ : \(

Escapar do (espaço) não faz diferença.

    
por 07.12.2014 / 16:57
5

Por padrão, sed usa Expressão Regular Básica (BRE) . Em BRE, \( e \) são usados para definir a subexpressão :

A subexpression can be defined within a BRE by enclosing it between the character pairs "(" and ")". Such a subexpression shall match whatever it would have matched without the "(" and ")", except that anchoring within subexpressions is optional behavior; see BRE Expression Anchoring. Subexpressions can be arbitrarily nested.

Em seguida, você pode usar a expressão de referência anterior '\n' para corresponder à mesma cadeia de caracteres (possivelmente vazia) de caracteres que foi correspondida por uma subexpressão entre \( e \) , onde n de 1 até %código%. Aqui, você usa apenas parênteses esquerdos 9 , \( não pode encontrar parênteses à direita e gerar um erro.

No BRE, você usa apenas sed para corresponder aos parênteses esquerdos literais.

Em algumas implementações de ( , você pode alternar para Expressões regulares estendidas (ERE) (exemplo GNU sed com sed opstion), então você deve use -r para corresponder aos parênteses esquerdos literais.

    
por 07.12.2014 / 17:43
0

Esta é exatamente a razão. Você não deve escapar dos parênteses neste caso.

Aspas simples ' já dizem ao shell para não se incomodar com o conteúdo da string, então ele é passado literalmente para sed. Escapar dos parênteses está dizendo ao sed para esperar o final \) como um delimitador para uma sub-regex.

    
por 07.12.2014 / 17:10