supprimer des caractères particuliers d'une variable à l'aide de bash


123

Je veux analyser une variable (dans mon cas, c'est la version du kit de développement) pour la rendre dot ( .) libre. Si version='2.3.3', la sortie souhaitée est 233.

J'ai essayé comme ci-dessous, mais cela nécessite .d'être remplacé par un autre personnage me le donnant 2_3_3. Cela aurait été bien si tr . ''cela avait fonctionné.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _

10
Non, il ne nécessite pas: echo "2.3.3" | tr -d ..
Manatwork

1
@manatwork Génial, ça marche. Vous pouvez poster comme réponse. Merci
prière

1
Beaucoup de bonnes réponses. Mais si je peux deviner l'objectif, soyez averti à propos de 2.11.3 et 2.1.13 ... ;-) Envisagez d'ajouter des zéros de remplissage aux nombres.
Rmano 12/12

1
@Rmano Vous voulez dire quelque chose comme VERSION='2.30.3100'? Peu importe ce qui vient .d'être enlevé avec toutes les réponses ici.
prier

2
@PrayagUpd --- Je voulais simplement dire que si vous utilisiez le nombre après la conversion pour faire des comparaisons (comme pour dire si "cette version est-elle plus récente ou identique"), vous devez vous occuper des cas tels que 2.11.3 et 2.1.13 - - ils semblent identiques après la suppression du point, mais il est clair que 2.11.3 est plus récent. De plus, 2.11.3 est plus récent que 2.1.14, mais comparer 2113 et 2114 conduira à une réponse fausse. Je me souviens d'un bug quelque part pour cela ...
Rmano

Réponses:


136

Il n'est pas nécessaire d'exécuter un programme externe. bashLa manipulation de chaîne de caractères peut le gérer (également disponible dans ksh(d'où il provient) et zsh):

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

(Dans les manuels de ces coques, vous le trouverez dans la section relative à l'extension des paramètres.)


19
Pour plus de détails, la syntaxe de la réponse ci-dessus est la suivante ${string//substring/replacement}: apparemment, l'absence de la barre oblique finale et de la chaîne de remplacement est interprétée comme une suppression . Voir ici .
sherrellbc

5
Oui, le man bashdit clairement dans la section Expansion des paramètres du shell : “ ${parameter/pattern/string}(…) Si string est nul, les correspondances de modèle sont supprimées et le modèle/ suivant peut être omis.”
manatwork

1
Mon problème était que le numéro de version était celui-ci "1.0.0"et que je ne voulais que le numéro, suivez donc ce que @manatwork a suggéré de remplacer: "${VERSIONNUM//'"'}"toutefois, je l'insère, ' ' car sinon, il ne reconnaîtrait pas la ""chaîne similaire à enlever.
Alexiscanny

1
@Alexiscanny, vous voulez dire que les littéraux "sont présents dans la valeur? J'ai bien peur que cela compte comme une nouvelle question, mais essayez d'échapper à la double citation: "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork

1
Superbe!! travaille -ashaussi!
Fr0zenFyr

88

Par ordre chronologique:

tr / sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

csh / tcsh

echo $VERSION:as/.//

Coquilles POSIX:

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash (et busybox ashquand construit avec ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./

1
tr -d a supprimé même un seul caractère de l'ensemble. Pour Ex, je veux supprimer DCC_ de "DCC_VersionD", Il supprime DCC et D. Résultat attendu: VersionD. Sortie réelle: version. Sed a travaillé comme un charme. :) Merci pour le post.
kayle

20

En plus des réponses réussies existe déjà. La même chose peut être réalisée avec tr, avec l' --deleteoption.

echo "2.3.3" | tr --delete .

Quel sera le résultat: 233


6
sur macos le --deletedrapeau n'est pas reconnu, mais vous pouvez utiliser à la -dplace
Anentropic

6

vous devriez essayer avec à la sedplace

sed 's/\.//g'


4
echo "$VERSION" | tr -cd [:digit:]

Cela ne renverrait que des chiffres, quels que soient les autres caractères présents


4

Perl

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

Python

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

Si $VERSIONseulement contient des chiffres et des points, nous pouvons faire quelque chose d'encore plus court:

$ python -c 'print "'$VERSION'".replace(".","")'
233

(attention, c'est une vulnérabilité d'injection de code, bien que $VERSIONpouvant contenir n'importe quel caractère).

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

Ou ca:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.