UNIX BASH: extraire le numéro de la chaîne

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