Comment utiliser grep sur une variable ou une chaîne?

2

J'écris un script bash et je dois vérifier si un nom de fichier a un numéro à la fin (après un point) et si c'est le cas, mais je ne peux pas comprendre comment utiliser l'expression régulière sur une variable ou une chaîne.

J'ai pu utiliser echodans le terminal pour diriger une chaîne dans grep, comme ceci:

 echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

Mais je dois assigner la sortie de ceci à une variable. J'ai essayé de faire ceci:

 revNumber= echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

Mais ça ne marche pas. J'ai aussi essayé d'autres choses, mais rien n'était valable.

Dans mon script bash, je veux utiliser grep sur une variable et non sur une chaîne, mais le concept est le même.

Comment puis-je utiliser grep sur une chaîne ou une variable puis sauvegarder le résultat dans une autre variable?

Nate
la source
les réponses arrières ne peuvent pas le résoudre .. c'est la syntaxe pour obtenir le résultat d'une commande dans une variable. r=`echo abc`echo $ r
barlop

Réponses:

5

Pour affecter le résultat d'une commande à une variable, utilisez $():

revNumber=$(echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+")

Si tout ce qui vous intéresse est de faire correspondre , vous voudrez peut-être envisager case:

case foo in
  f*) echo starts with f
   ;;
  *) echo does not start with f
   ;;
esac
sds
la source
Bonne réponse. Je connaissais la forme de substitution de commande de backtick / backquote, mais j'avais oublié la $()forme.
Arkanon
@Arkanon: ``c'est du style ancien; $()est plus propre.
Sds
0

Pourquoi le grep et echo E / O overkill, je suggère d'utiliser des capacités de traitement de chaîne bash:

TESTFNAME="filename.txt.283" # you can collect this from doing an ls in the target directory

# acquire last extension using a regexp, including the '.':
FEXT=$(expr "$TESTFNAME" : '.*\(\.[[:digit:]][[:digit:]]*\)')

# check if length is more than just the dot, that means we've got digits:
if [  ${#FEXT} -gt 1 ]; then
    echo "Gotcha!" $testFilename ${#FEXT} $FEXT # do whatever you like with the file
fi

La regex peut être optimisée et n'est pas parfaite, mais voici les bases:

  • . * au début cherchera à la fin du fichier.
  • [[: digit ::]] est presque identique à [0-9], mais je le trouve plus lisible

Découvrez les autres capacités de manipulation de chaînes bash sur TLDP ici .

Milen
la source
0

Ce qui suit est une autre option qui utilise une comparaison de regex bash avant d’extraire la valeur à la fin de la chaîne.

if [[ $TESTFNAME =~ \.[0-9]+$ ]]; then
  VAL=$(egrep -o '[0-9]+$' <<<"$TESTFNAME")
fi
Lenny
la source