web-dev-qa-db-ja.com

文字列の一部を変数に抽出するにはどうすればよいですか?

次のようなファイルの行があります。

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

512^316^332^3および800から4つの数値を抽出して、それぞれ4つの変数levelgridboxesおよびtasks他の用途。

これどうやってするの?

8
Yulong Ao

Bashは=~演算子[[ ... ]]

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

これがあなたが書いたプログラム/スクリプトからの出力であり、テキストが定型的である場合(つまり、このパターンに正確に従う)、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 -)
2
toxefa

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
jasonwryan

行が常にこの構造を持っている場合、 read は、外部プロセスなしで1行でこれを実行できます。

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

herestring も使用)。これにより、不要なすべての単語がx(無視される)に保存され、必要な値がそれぞれの変数に保存されます。

1
Michael Homer