Como pesquisar parênteses por ack

0

Eu quero procurar por um parêntese ( usando ack , mas nem usar ( nem \( funcionou.

O primeiro (" ( ") é reconhecido como um comando de múltiplas linhas. O segundo (" \( ") é tratado como uma expressão regular inválida.

Como posso pesquisar por um caractere parêntese com ack ?

Mensagem de erro

 % ack foo\(
Invalid regex 'foo(':
  Unmatched ( in regex; marked by <-- HERE in m/foo( <-- HERE / at /usr/local/bin/ack line 332.
    
por ironsand 04.03.2015 / 10:18

2 respostas

2

Para procurar um caractere parêntese, passe barra invertida + parêntese para ack.

As barras invertidas e os parênteses são especiais no shell, portanto, é necessário citá-los quando você os digita em um script de shell ou na linha de comando. A forma mais simples de citar é com aspas simples: isso diz ao shell para passar tudo literalmente, exceto as própriaspas simples.

ack '\('

Você também pode usar barras invertidas para proteger caracteres especiais da expansão do shell, mas ela tende a ser menos legível:

ack \\(

A primeira barra invertida cita a segunda no shell, de forma que o primeiro caractere do argumento para ack seja \ . A terceira barra invertida cita os parênteses, portanto, o segundo caractere do argumento para ack é ( . Como no caso das aspas simples acima, o argumento de que ack é a cadeia de dois caracteres \( .

ack ( não funciona porque o shell vê um parêntese de abertura e o trata como sintaxe do shell. ack \( não funciona porque o shell passa ( como argumento para ack e ack interpreta os parênteses na expressão regular como indicando o início de um grupo.

    
por 05.03.2015 / 01:15
0

não sei o erro exato que você obtém, mas aqui funciona usando parênteses com escape (" \( ")

 $ cat > test.c <<EOF
 int main() {
   return 0;
 }
 EOF
 $ ack '\(' test.c 
 int main() {
 $
    
por 04.03.2015 / 10:44