Come estrarre parti di una stringa in variabili?


8

Ho una riga da un file come questo:

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

Voglio estrarre il 512^3, 16^3, 32^3e 800quattro numeri da esso e assegnarli rispettivamente alle quattro variabili level, grid, boxese tasksper altri usi.

Come posso fare questo?


Sì, i primi tre hanno il formato a ^ b e l'ultimo solo il solito numero.
Yulong Ao,

Risposte:


15

Bash può abbinare espressioni regolari con l' =~operatore in [[ ... ]]:

#! /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

2
Wow, non
ho

FYI 1: quando si scrive direttamente regexp, non inserirlo tra virgolette . Ad esempio [[ 'Example 123' =~ '([0-9]+)' ]]è falso, ma [[ 'Example 123' =~ ([0-9]+) ]]funziona come previsto.
Jonathan H,

FYI 2: l'acquisizione non funziona più volte. Ad esempio [[ '1_2_3' =~ ([0-9]) ]] && echo ${BASH_REMATCH[@]}solo le partite 1.
Jonathan H,

2

Usando 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

2

Se questo viene emesso da un programma / script che hai scritto e il testo è di formula (cioè segue esattamente questo schema) puoi semplicemente usare 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 -)

1

Se la linea ha sempre esattamente questa struttura, readpuoi farlo in una sola linea senza processi esterni:

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

(anche usando un herestring ). Ciò salverà tutte le parole che non ti interessano x(da ignorare) e i valori desiderati nelle rispettive variabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.