“bash: erro de sintaxe quase inesperado ')” no Linux Shell

2

Eu estou procurando uma string entre aspas, onde a palavra Linux ocorre entre parênteses que residem em algum lugar dentro das aspas. Eu tenho que usar uma expressão regular para fazer isso. Eu sou obrigado a fazê-lo em um sistema operacional Linux (usando o Virtual Box Terminal). Eu usei o seguinte regex:

 egrep "\"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?\"" [FILE]

Mas o problema é que eu recebo

bash: syntax error near unexpected token '("

todas as vezes. Qual pode ser o problema? Eu tentei este regex em " link " funciona bem, não há nada de errado com o regex. Mas o shell do Linux sempre produz o mesmo problema ... Eu usei "\" na frente dos parênteses porque eles são metacaracteres. A mesma coisa que fiz na frente de aspas duplas ... Mas isso não funciona. Alguém poderia me ajudar, por favor?

    
por Konstantin Pak 28.08.2016 / 16:52

2 respostas

5

O problema são as aspas duplas sem escape dentro da expressão, por exemplo, em torno desta parte "]*)?\(([^]" . Se você quiser passar literal " , incluindo entre aspas duplas ou () ou [] , então você deve citar as aspas! Você poderia fazer

egrep "\"([^\"]*)?\(([^\"]*)?Linux([^\"]*)?\)([^\"]*)?\"" FILE

Mas uma maneira menos feia é citar toda a expressão com aspas simples , e em geral sempre strong (simples) citar sua regex para que a shell não faça nada de estranho antes de ser passada como um argumento para egrep ou qualquer programa que você esteja usando:

egrep '"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?"' FILE

(agora você não precisa escapar as aspas duplas do lado de fora também, mas você precisa das outras barras invertidas para fazer o literal de parênteses (em ERE))

se você não quiser o resto da linha, adicione -o (somente correspondência) também

egrep -o '"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?"' FILE

Você não deu um exemplo, então eu fiz um bobo ... aqui está antes:

what
where is "the (lost Linux that I want) to find somewhere" in this file
and some junk
we don't want this thing "here where Linux is (not in brackets)"

e depois:

"the (lost Linux that I want) to find somewhere"

(NB: usando o GNU grep você pode fazer grep -E ao invés de usar egrep )

    
por Zanna 28.08.2016 / 17:16
3

Substitua a primeira e a última cota dupla " por uma cota única ' .

egrep '\"([^"]*)?\(([^"]*)?Linux([^"]*)?\)([^"]*)?\"' [FILE]
    
por Thomas 28.08.2016 / 17:03