web-dev-qa-db-fra.com

"bash: erreur de syntaxe proche de l'inattendu ')" dans Linux Shell

Je cherche une chaîne entre guillemets où Word Linux apparaît quelque part entre parenthèses qui résident quelque part entre les guillemets. Je dois utiliser une expression régulière pour le faire. Je suis obligé de le faire dans un système d'exploitation Linux (utilisant Virtual Box Terminal). J'ai utilisé l'expression régulière suivante:

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

Mais le problème est que je reçois

bash: syntax error near unexpected token '("

à chaque fois. Quel peut être le problème? J'ai essayé cette expression rationnelle dans " http://regexr.com/ " cela fonctionne bien, il n'y a rien de mal à la regex. Mais le shell Linux produit toujours le même problème ... J'ai utilisé le caractère "\" devant les parenthèses car ce sont des métacaractères. La même chose que j'ai faite devant les guillemets ... Mais ça ne marche pas. Quelqu'un pourrait-t'il m'aider s'il vous plaît?

2
Konstantin Pak

Le problème réside dans les guillemets doubles non masqués dans l'expression, par exemple autour de cette partie "]*)?\(([^]". Si vous voulez passer littéral ", y compris entre guillemets ou () ou [], vous devez alors citer les guillemets! Vous pourriez faire

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

Mais une façon moins laide est de citer l'expression entière avec guillemets simples, et en général toujours forte (guillemet simple) de citer votre regex afin que le shell ne lui fasse rien de bizarre avant qu'il ne soit passé comme argument à egrep ou le programme que vous utilisez:

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

(à présent, vous n'avez plus besoin d'échapper aux guillemets à l'extérieur, mais vous avez besoin des autres barres obliques inverses pour que les parenthèses soient littérales (dans ERE))

si vous ne voulez pas le reste de la ligne, ajoutez également -o (correspondance uniquement) également

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

Vous n’avez pas donné d’exemple, j’en ai fait un stupide ... voici avant:

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)"

et après:

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

(NB: en utilisant GNU grep, vous pouvez faire grep -E au lieu d'utiliser egrep.)

5
Zanna

Remplacez le premier et le dernier guillemet double " par un guillemet simple '.

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