문자열의 일부를 변수로 추출하는 방법은 무엇입니까?

문자열의 일부를 변수로 추출하는 방법은 무엇입니까?

다음과 같은 일부 파일의 줄이 있습니다.

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, 4개의 숫자를 추출하여 다른 용도로 각각 4개의 변수 , , 및 에 할당하고 싶습니다 .32^3800levelgridboxestasks

어떻게 해야 하나요?

답변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(무시됨)가 해당 변수에 저장되고, 원하는 값이 해당 변수에 저장됩니다.

관련 정보