web-dev-qa-db-fra.com

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

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

J'ai essayé comme ci-dessous, mais cela nécessite . à remplacer par un autre caractère me donnant 2_3_3. Cela aurait été bien si tr . '' aurait fonctionné.

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

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

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

(Dans les manuels de ces shells, vous pouvez trouver cela dans la section d'extension des paramètres.)

148
manatwork

Par ordre chronologique:

tr/sed

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

csh/tcsh

echo $VERSION:as/.//

Coques POSIX:

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

ksh/zsh/bash/yash (et busybox ash lorsqu'il est construit avec ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./
97
Stéphane Chazelas

En plus des réponses réussies existe déjà. La même chose peut être obtenue avec tr, avec le --delete option.

echo "2.3.3" | tr --delete .

Qui produira: 233

24
daz

vous devriez essayer avec sed à la place

sed 's/\.//g'

8
fduff

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 $VERSION ne contient que 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 si $VERSION peut 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
4
Sergiy Kolodyazhnyy
echo "$VERSION" | tr -cd [:digit:]

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

4
user2796674