回答:
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
[[ 'Example 123' =~ '([0-9]+)' ]]
falseですが[[ 'Example 123' =~ ([0-9]+) ]]
、意図したとおりに機能します。
[[ '1_2_3' =~ ([0-9]) ]] && echo ${BASH_REMATCH[@]}
のみに一致し1
ます。
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
これがあなたが書いたプログラム/スクリプトからの出力であり、テキストが定型的である(つまり、このパターンに正確に従う)場合は、そのまま使用できます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 -)
行が常に正確にこの構造を持っている場合、read
これを外部プロセスなしで単一行で行うことができます:
read x x x x level x x x x x x grid x x boxes x x tasks x <<<"$line"
(ここでもherestringを使用)。これにより、気にしないx
(無視される)単語と、必要な値がそれぞれの変数に保存されます。