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
}
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))
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]}"
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.
Utilisez grep. Sed est un éditeur. Si vous souhaitez uniquement faire 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 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
}
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é.