Làm cách nào để trích xuất các phần của chuỗi thành biến?


8

Tôi có một dòng từ một số tập tin như thế này:

attempting to create a 512^3 level (with Dirichlet BC) using a 16^3 grid of 32^3 boxes and 800 tasks...

Tôi muốn trích xuất các 512^3, 16^3, 32^3800bốn số từ nó và gán chúng tương ứng với bốn biến level, grid, boxestaskssử dụng khác.

Tôi có thể làm cái này như thế nào?


Có, ba trong số đầu tiên có định dạng a ^ b và cuối cùng chỉ là số thông thường.
Yulong Ao

Câu trả lời:


15

Bash có thể khớp các biểu thức chính quy với =~toán tử trong [[ ... ]]:

#! /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
Wow, không bao giờ biết Bash có thể làm một cái gì đó như thế này :)
Erathiel

FYI 1: khi viết regrec trực tiếp, không đặt nó trong dấu ngoặc kép . Ví dụ [[ 'Example 123' =~ '([0-9]+)' ]]là sai, nhưng [[ 'Example 123' =~ ([0-9]+) ]]hoạt động như dự định.
Jonathan H

FYI 2: chụp không hoạt động nhiều lần. Ví dụ [[ '1_2_3' =~ ([0-9]) ]] && echo ${BASH_REMATCH[@]}chỉ phù hợp 1.
Jonathan H

2

Sử dụng 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

Nếu đây là đầu ra từ một chương trình / tập lệnh bạn đã viết và văn bản có công thức (nghĩa là theo chính xác mẫu này), bạn chỉ có thể sử dụng 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

Nếu dòng luôn có chính xác cấu trúc này, readcó thể thực hiện điều này trong một dòng duy nhất mà không có quy trình bên ngoài:

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

(cũng sử dụng một herestring ). Điều này sẽ lưu tất cả các từ bạn không quan tâm x(bị bỏ qua) và các giá trị bạn muốn vào các biến tương ứng của chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.