web-dev-qa-db-fra.com

Renvoyer une correspondance regex dans un script BASH, au lieu de la remplacer

Je veux juste faire correspondre du texte dans un script BASH, j’ai déjà essayé d’utiliser sed, mais je ne peux pas sembler le forcer à sortir la correspondance au lieu de le remplacer par quelque chose.

echo -E "TestT100String" | sed 's/[0-9]+/dontReplace/g'

Quel sera le résultat: TestTdontReplaceString

Ce qui n’est pas ce que je veux, je veux qu’il produise: 100

Idéalement, je voudrais qu'il mette toutes les correspondances dans un tableau.

edit: La saisie de texte arrive sous forme de chaîne:

newName()
{
 #Get input from function
 newNameTXT="$1"

 if [[ $newNameTXT ]]; then
 #Use code that im working on now, using the $newNameTXT string.

 fi
} 
20
Mint
echo "TestT100String" | sed 's/[^0-9]*\([0-9]\+\).*/\1/'

echo "TestT100String" | grep -o  '[0-9]\+'

La méthode que vous utilisez pour placer les résultats dans un tableau dépend un peu de la façon dont les données réelles sont récupérées. Il n’ya pas assez d’informations dans votre question pour pouvoir bien vous guider. Cependant, voici une méthode:

index=0
while read -r line
do
    array[index++]=$(echo "$line" | grep -o  '[0-9]\+')
done < filename

Voici un autre moyen:

array=($(grep -o '[0-9]\+' filename))
28
Dennis Williamson

Vous pouvez le faire uniquement en bash en utilisant l'opérateur de test [[ ]] à double crochet, qui stocke les résultats dans un tableau appelé BASH_REMATCH:

[[ "TestT100String" =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
32
John Kugelman

Pure Bash . Utilisez la substitution de paramètre (pas de processus externes ni de canaux):

string="TestT100String"

echo ${string//[^[:digit:]]/}

Supprime tous les non-chiffres. 

15
Fritz G. Mehner

Utilisez grep. Sed est un éditeur. Si vous souhaitez uniquement faire correspondre une expression rationnelle, grep est plus que suffisant.

6
Mic

en utilisant awk

linux$ echo -E "TestT100String" | awk '{gsub(/[^0-9]/,"")}1'
100
1
ghostdog74

Je ne sais pas pourquoi personne n'utilise jamais expr: c'est portable et facile.

newName()
{
 #Get input from function
 newNameTXT="$1"

 if num=`expr "$newNameTXT" : '[^0-9]*\([0-9]\+\)'`; then
  echo "contains $num"
 fi
}
1
ephemient

Eh bien, le Sed avec le s/"pattern1"/"pattern2"/g remplace simplement globalement tous les pattern1 du pattern 2.

De plus, sed affiche par défaut la totalité de la ligne par défaut .

Si vous cherchez seulement à utiliser sed, utilisez TRE:

sed -n 's/.*\(0-9\)\(0-9\)\(0-9\).*/\1,\2,\3/g'.

Je ne veux pas essayer et exécuter la commande ci-dessus alors assurez-vous juste que la syntaxe est correcte . J'espère que cela vous a aidé.

0
tomkaith13