C’est probablement une question très simple pour une personne expérimentée avec UNIX mais j’essaie d’extraire un nombre d’une chaîne et d’obtenir un résultat erroné.
Ceci est la chaîne:
8962 ? 00:01:09 java
C’est la sortie que je veux
8962
Mais pour une raison quelconque, je continue à obtenir la même chaîne exacte. C’est ce que j’ai essayé
pid=$(echo $str | sed "s/[^[0-9]{4}]//g")
Si quelqu’un pouvait m’aider, ce serait apprécié.
Il y a plus d’une façon de peler un chat:
pti@pti-laptop:~$ echo 8962 ? 00:01:09 java | cut -d' ' -f1 8962 pti@pti-laptop:~$ echo 8962 ? 00:01:09 java | awk '{print $1}' 8962
cut coupe une ligne dans différents champs basés sur un délimiteur ou des plages d’octets et est souvent utile dans ces tâches.
awk est un langage de programmation plus ancien, particulièrement utile pour faire des choses une ligne à la fois.
Shell, pas besoin d’appeler des outils externes
$ s="8962 ? 00:01:09 java" $ IFS="?" $ set -- $s $ echo $1 8962
Pure Bash:
ssortingng='8962 ? 00:01:09 java' pid=${ssortingng% \?*}
Ou:
ssortingng='8962 ? 00:01:09 java' array=($ssortingng) pid=${array[0]}
Je pense que c’est ce que vous voulez:
pid=$(echo $str | sed 's/^\([0-9]\{4\}\).*/\1/')
Pure Bash:
ssortingng="8962 ? 00:01:09 java" [[ $ssortingng =~ ^([[:digit:]]{4}) ]] pid=${BASH_REMATCH[1]}
/^[0-9]{4}/
correspond à 4 chiffres au début de la chaîne