Comment extraire des parties d'une string à des variables?

J'ai une ligne de certains files comme ceci:

attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks... 

Je veux extraire de lui les 512^3 , 512^3 , 16^3 , 16^3 , 32^3 , 32^3 et 800 et les affecter respectivement à quatre variables de level , de grid , de boxes et de tasks pour un autre usage.

Comment puis-je faire ceci?

Bash peut faire correspondre des expressions régulières avec l'opérateur =~ dans [[ ... ]] :

 #! /bin/bash line='attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks...' num='([0-9^]+)' nonum='[^0-9^]+' if [[ $line =~ $num$nonum$num$nonum$num$nonum$num ]] ; then level=${BASH_REMATCH[1]} grid=${BASH_REMATCH[2]} boxes=${BASH_REMATCH[3]} tasks=${BASH_REMATCH[4]} echo "Level $level, grid $grid, boxes $boxes, tasks $tasks." fi 

Utilisation de awk:

 awk '{print "level="$5"\n""grid="$12"\n""boxes="$15"\n""tasks="$18}' file level=512^3 grid=16^3 boxes=32^3 tasks=800 

S'il s'agit d'un programme / script que vous avez écrit et que le text est stéréotypé (c'est-à-dire qu'il suit exactement ce model), vous pouvez simplement utiliser le cut .

 #!/bin/bash $STRING='attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks...' level=$(echo $STRING | cut -d' ' -f5 -) grid=$(echo $STRING | cut -d' ' -f12 -) boxes=$(echo $STRING | cut -d' ' -f15 -) tasks=$(echo $STRING | cut -d' ' -f18 -) 

Si la ligne a toujours exactement cette structure, read peut le faire sur une seule ligne sans process externes:

 read xxxx level xxxxxx grid xx boxes xx tasks x <<<"$line" 

(utilisant également un heressortingng ). Cela permettra d'save tous les mots qui ne vous intéressent pas dans x (à ignorer) et les valeurs que vous voulez dans leurs variables respectives.