Intereting Posts
Как распечатать последнее слово, которое содержит разделитель поля MacBook Pro Parallels (Kali) Linux Ограниченное разрешение экрана Проблемы с ngircd / xchat SSL Двойная загрузка Debian и Windows 10: загрузка в Windows 10 без меню для выбора ОС Существует ли веб-конвертер между rwx и восьмеричной версией? Есть ли способ получить «топ» для запуска ровно один раз и выйти? Сенсорная панель была отключена после подключения мыши Bluetooth и возврата Насколько хорошо работает grep / sed / awk на очень больших файлах? Чтение именованного канала: хвост или кошка? Установка родовых логотипов и универсальных выпусков на Fedora Systemd размонтирует раздел my / boot Перенос Xbindkeys / клавишных клавиш в Wayland? Есть ли какие-либо предстоящие дистрибутивы, предлагающие PHP 7 по умолчанию? Сценарий Bash: сделать что-то один раз внутри цикла, а затем остановить, но продолжить цикл Как получить владельца файла в AIX без вывода munging ls?

Как извлечь части строки в переменные?

У меня есть строка из некоторого файла:

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 для другого использования.

Как я могу это сделать?

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 

Использование 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 

Если это выводится из написанной вами программы / скрипта, и текст является формульным (т. Е. Следует именно этому шаблону), вы можете просто использовать 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 -) 

Если строка всегда имеет именно эту структуру, read может сделать это в одной строке без внешних процессов:

 read xxxx level xxxxxx grid xx boxes xx tasks x <<<"$line" 

(также с использованием ареста ). Это сохранит все слова, которые вам не нужны, в x (для игнорирования) и значения, которые вы хотели бы использовать в своих переменных.