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


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^3800从它的四个数字分别为它们分配到四个变量levelgridboxestasks用于其他用途。

我怎样才能做到这一点?


是的,它们的前三个格式为a ^ b,最后一个为通常的数字。
Yulong Ao

Answers:


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'Aug

仅供参考1:直接编写正则表达式时,请勿将其放在引号中。例如,[[ 'Example 123' =~ '([0-9]+)' ]]为false,但[[ 'Example 123' =~ ([0-9]+) ]]按预期工作。
乔纳森H

仅供参考2:捕获无法多次进行。例如[[ '1_2_3' =~ ([0-9]) ]] && echo ${BASH_REMATCH[@]}仅匹配1
乔纳森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(忽略)并将所需的值保存到它们各自的变量中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.