8
votes

Comment échapper à une chaîne précédemment inconnue dans une expression régulière?

J'ai besoin de Egrep une chaîne qui n'est pas connue avant l'exécution et que je vais avoir via une variable de shell (Shell est bash, si cela importe). Le problème est que cette chaîne contiendra des caractères spéciaux tels que des accolades, des espaces, des points, des barres obliques, etc.

Si je connais la chaîne, je peux échapper aux caractères spéciaux une à la fois, mais comment puis-je faire cela pour toute la chaîne?

Exécution de la chaîne via un script SED pour préfixer chaque caractère spécial avec \ pourrait être une idée, j'ai toujours besoin de RTFM comment un tel script devrait être écrit. Je ne sais pas s'il y a d'autres, meilleures, options.

J'ai lu re_format (7) mais il semble qu'il n'y ait rien de tel comme "Prendre toute la chaîne suivante comme littéral" ...

Edit: Pour éviter les faux positifs, je devrais également ajouter une détection de nouvelle ligne au motif, par exemple. Egrep '^ MyunknownString'


1 commentaires

Comment échapper aux expressions régulières dans Bash Stackoverflow.com/Questtions/11856054/...


3 Réponses :


4
votes

Utilisez le drapeau -f pour faire le motif une chaîne littérale fixe xxx


1 commentaires

Merci pour la pointe, c'est correct, mais j'ai oublié de préciser que j'ai également besoin de faire correspondre la chaîne seulement au début de la ligne. J'ai ajouté ce détail à la question.



7
votes

Si vous devez intégrer la chaîne dans une expression plus grande, sed code> est comment je le ferais.

s_esc="$(echo "$s" | sed 's/[^-A-Za-z0-9_]/\\&/g')" # backslash special characters
inv_ent="$(egrep "^item [0-9]+ desc $s_esc loc .+$" inventory_list)"


2 commentaires

Essayez s / [^ [: alnum:] _-] / \\ & / g ' plutôt parce que votre version ne fonctionne pas sur tous les locaux


s_esc = $ (echo "$ s" | s / [] s / [] \\. $ * {} | +? () [^ -] / \\ & / g ') devrait aussi fonctionner .



0
votes

essayez-vous de protéger la chaîne d'être interprété de manière incorrecte en tant que syntaxe BASH ou essayez-vous de protéger des parties de la chaîne d'être interprétée comme syntaxe d'expression régulière?

pour la protection Bash:

GREP Prend en charge le commutateur -f : xxx

Aucun évacuation n'est nécessaire dans le fichier. Il suffit de faire un fichier contenant une seule ligne (et donc un motif) qui peut être produit à partir de votre coque variable si c'est ce que vous devez faire. xxx

juste pour illustrer le Point.

Essayez-le avec -f à la place comme une autre affiche suggérée pour la protection antirégène.


0 commentaires