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


8

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

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その他の使用のために。

これどうやってするの?


はい、最初の3つはa ^ bという形式で、最後の1つは通常の数です。
Yulong Ao

回答:


15

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

2
うわー、Bashがこのようなことをできるとは知らなかった:)
Erathiel

参考:正規表現を直接記述する場合は、引用符で囲まないください。たとえば[[ 'Example 123' =~ '([0-9]+)' ]]falseですが[[ 'Example 123' =~ ([0-9]+) ]]、意図したとおりに機能します。
Jonathan H

参考2:キャプチャが複数回機能しない。たとえば、[[ '1_2_3' =~ ([0-9]) ]] && echo ${BASH_REMATCH[@]}のみに一致し1ます。
Jonathan H

2

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

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

行が常に正確にこの構造を持っている場合、readこれを外部プロセスなしで単一行で行うことができます:

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

(ここでもherestringを使用)。これにより、気にしないx(無視される)単語と、必要な値がそれぞれの変数に保存されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.