2 votes

BASH - grep - fonctionne en ligne de commande, mais pas dans un script

Je essaie d'obtenir le nombre d'occurrences dans un script et lorsque j'exécute la commande en ligne de commande, cela fonctionne bien, mais pas dans un script. Les deux variables sont initialisées. FILE_PATH est le chemin absolu du fichier et VARIABLE_NAME est quelque chose comme firstName ou lastName.

VARIABLE_NAME="_firstName"    
grep -cP "\(this\.|\s\){1}$VARIABLE_NAME" $FILE_PATH

Lorsque je retire $VARIABLE_NAME du script et le remplace directement par ce que je cherche, cela fonctionne comme prévu, donc c'est quelque chose avec le remplacement.

Des idées sur ce que je peux essayer?

2voto

Owain Hunt Points 1119

Le problème semble résider dans votre regex. pouvez-vous nous montrer ce que vous essayez de faire correspondre?

si vous essayez de faire correspondre des constructions comme ceci :

this.contentOfVar
  contentOfVar

essayez avec ce qui suit :

grep -cP "(this\.|\s)$VARIABLE_NAME" $FILE_PATH

Cela fonctionne dans GNU grep. Vous n'avez pas à spécifier {1}, car la valeur par défaut sera 1. Avec le drapeau -P activé, \( et \) correspondent aux parenthèses littérales dans la chaîne, car c'est le comportement de perl.

0voto

Amethyst Wizard Points 7802

Cela concerne l'échappement des guillemets et des barres obliques :

VARIABLE_NAME="_firstName"
FILE_PATH="/tmp/*"
echo grep -cP \"\\\(this\\\.\|\\\s\\\)${VARIABLE_NAME}\" $FILE_PATH
grep -cP \"\\\(this\\\.\|\\\s\\\)${VARIABLE_NAME}\" $FILE_PATH

J'ai ajouté l'echo comme exemple pour montrer comment c'est réellement interprété.

0voto

Martin Peck Points 8078

Pour ajouter aux réponses des autres, je recommanderais d'utiliser des guillemets simples sauf lorsque vous avez explicitement besoin de quelque chose d'une variable. Par exemple :

#!/usr/bin/env bash

dosomething | grep -cP 'some stuff'${SOMEVARIABLE}'more stuff';

Si vous avez besoin de guillemets simples dans l'expression régulière, cela semble un peu plus laid :

# ...
dosomething | grep -cP 'some stuff'"'"'this part has a single-quote around it'"'"${SOMEVARIABLE}'more stuff';

L'avantage d'utiliser des guillemets simples est que vous n'avez pas besoin d'échapper les choses.

-Brian

0voto

h0tw1r3 Points 1676

Il semble que le problème soit lié à l'échappement des regex. Voici un exemple complet de fonctionnement de la façon dont je ferais quelque chose comme ça.

#!/bin/bash

NOMS_VARIABLES=(testOne testTwo)
RE="(this\.|\s){1}"

cat > ./testfile.txt <

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X