如何将字符串的一部分提取到变量中?

如何将字符串的一部分提取到变量中?

我有一些文件中的一行,如下所示:

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和四个数字,并将它们分别分配给四个变量、、和以供其他使用。800levelgridboxestasks

我怎样才能做到这一点?

答案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 -)

答案4

如果该行始终具有这种结构,read可以在没有外部进程的情况下在一行中完成此操作:

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

(也使用此处字符串)。这会将您不关心的所有单词x(将被忽略)保存到它们各自的变量中,并将您想要的值保存到它们各自的变量中。

相关内容