Como eu extraio partes de uma string para variáveis?

7

Eu tenho uma linha de algum arquivo como este:

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

Eu quero extrair os números 512^3 , 16^3 , 32^3 e 800 quatro deles e atribuí-los respectivamente a quatro variáveis level , grid , boxes e tasks para outro uso.

Como posso fazer isso?

    
por Yulong Ao 16.04.2015 / 09:35

4 respostas

12

O Bash pode corresponder expressões regulares ao operador =~ em [[ ... ]] :

#! /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
    
por 16.04.2015 / 10:11
2

Usando o 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
    
por 16.04.2015 / 10:24
2

Se esta for a saída de um programa / script que você tenha escrito e o texto for estereotipado (ou seja, seguir exatamente esse padrão), você poderá usar apenas 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 -)
    
por 16.04.2015 / 09:58
1

Se a linha sempre tiver exatamente essa estrutura, read pode faça isso em uma única linha sem processos externos:

read x x x x level x x x x x x grid x x boxes x x tasks x <<<"$line"

(também usando um herestring ). Isso salvará todas as palavras com as quais você não se importa em x (a serem ignoradas) e os valores desejados em suas respectivas variáveis.

    
por 16.04.2015 / 10:12