Question

Je veux juste faire correspondre un texte dans un script BASH, I'v essayé d'utiliser sed, mais je ne peux pas sembler faire juste sortie le match au lieu de le remplacer par quelque chose.

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

Ce qui va afficher: TestTdontReplaceString

Ce qui est pas ce que je veux, je le veux à la sortie: 100

Idéalement, je voudrais à mettre tous les matches dans un tableau.

modifier: La saisie de texte vient en tant que chaîne:

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

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

 fi
} 
Était-ce utile?

La solution

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

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

La méthode utilisée pour mettre les résultats dans un tableau dépend un peu sur la façon dont les données réelles sont en cours de récupération. Il n'y a 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 une autre façon:

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

Autres conseils

Vous pouvez le faire purement bash en utilisant la double support carré opérateur de test de [[ ]], qui stocke les résultats dans un tableau appelé BASH_REMATCH:

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

pur Bash . Utilisation substitution de paramètre (pas de processus et des conduites externes):

string="TestT100String"

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

supprime tous les non-chiffres.

Utilisez grep. Sed est un éditeur. Si vous voulez seulement correspondre à une expression rationnelle, grep est plus que suffisant.

en utilisant awk

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

Je ne sais pas pourquoi personne ne l'utilise expr: il est portable et facile

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

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

Je sais que c'est un vieux sujet, mais je lui est arrivé même des recherches et a trouvé une autre grande possibilité d'appliquer une regex sur une chaîne / variable en utilisant grep:

# Simple
$(echo "TestT100String" | grep -Po "[0-9]{3}")
# More complex using lookaround
$(echo "TestT100String" | grep -Po "(?i)TestT\K[0-9]{3}(?=String)")

Avec l'aide des fonctions de lookaround expressions de recherche peut être prolongée pour une meilleure correspondance. Où (?i) indique le motif avant que le motif recherché (préanalyse), \K indique le motif de recherche réelle et (?=) contient le modèle après la recherche (lookbehind).

https://www.regular-expressions.info/lookaround.html

L'exemple donné correspond à la même que la TestT([0-9]{3})String regex PCRE

Eh bien, le Sed avec le s / "motif1" / "pattern2" / g remplace tout le monde tous les pattern1s à motif 2.

En outre, sed alors par défaut imprimer toute la ligne par défaut. Je suggère tuyauterie l'instruction à une commande de coupe et d'essayer d'extraire les nombres u want:

Si u sont lookin de n'utiliser sed puis utilisez ERT:

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

Je force essayer de lancer la commande ci-dessus si juste assurez-vous que la syntaxe est juste. Espérons que cela a aidé.

en utilisant seulement le shell bash

declare -a array
i=0
while read -r line
do
        case "$line" in
            *TestT*String* )
            while true
            do
                line=${line#*TestT}
                array[$i]=${line%%String*}
                line=${line#*String*}
                i=$((i+1))
                case "$line" in
                    *TestT*String* ) continue;;
                    *) break;;
                esac
            done
            esac
done <"file"
echo ${array[@]}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top