Answers:
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
。
如果这是从您编写的程序/脚本输出的,并且文本是公式化的(即完全遵循此模式),则可以使用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
(忽略)并将所需的值保存到它们各自的变量中。