我有一些文件中的一行,如下所示:
attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks...
我想从中提取512^3
、16^3
、32^3
和四个数字,并将它们分别分配给四个变量、、和以供其他使用。800
level
grid
boxes
tasks
我怎样才能做到这一点?
答案1
Bash 可以将正则表达式与=~
运算符 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
使用 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
答案3
如果这是您编写的程序/脚本的输出,并且文本是公式化的(即完全遵循此模式),您可以使用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 -)