2016-06-21 3 views
-2

Как извлечь текст из следующего текста и сохранить его в переменных:Извлечение текста с любой командой в Linux оболочки

05:21-09:32, 14:21-19:30 

Здесь я хочу сохранить 05 в одной переменной, 21 в другом, 09 в другом и так далее. Все значения должны храниться в массиве или в отдельной переменной.

Я попытался:

k="05:21-09:32, 14:21-19:30" 

part1=($k | awk -F"-" '{print $1}' | awk -F":" '{print $1}')                              
part2=($k | awk -F"-" '{print $2}' | awk -F":" '{print $1}') 
part3=($k | awk -F"," '{print $2}' | awk -F":" '{print $1}') 
part4=($k | awk -F"-" '{print $3}' | awk -F":" '{print $1}') 

мне нужно более четкое решение или короткое решение.

+4

, пожалуйста, покажите свои попытки. Googling немного бы показал вам много хороших ответов – fedorqui

+0

D = "2013/01/17" DAY = $ (date -d "$ D" '+% d') MONTH = $ (date -d "$ D «+% m») YEAR = $ (date -d "$ D" '+% Y') echo "День: $ DAY" echo "Месяц: $ MONTH" echo "Год: $ YEAR" –

+0

@ RaghulM, который даже не близок к дублированию для этой проблемы, кроме тангенциальной ссылки на 'grep' как возможность. Ссылка, о которой вы говорите, касается того, как сопоставить известный текст в файлах, где это как разделить данные на отдельные поля. Нигде близко к тому же. Надеюсь, что вы не проголосовали за это. –

ответ

1

Ваш код имеет ряд проблем.

  • Вы не можете конвейер значение k на стандартный вывод только с $k - Вы хотите что-то вроде printf '%s\n' "$k" или, возможно, менее портативного echo "$k"
  • Обратите также внимание, цитируя в приведенном выше выражении; без него, оболочки будет выполнять расширение подстановочного и пробельную лексемизацию на значении
  • Нерест два процессов AWK для простой подстановки строк является чрезмерным
  • Нереста отдельного трубопровода для каждого значения, которое необходимо извлечь неэффективно; если это вообще возможно, извлечь все за один раз.

Нечто подобное IFS=':-, '; set -- $k присвоит части к $1, $2, $3 и $4 на одном дыхании.

2

Вы можете использовать read с опцией -a rray:

IFS=':-, ' read -ra my_arr <<< "05:21-09:32, 14:21-19:30" 

Приведенный выше код будет разделен на входную строку на :, -, , и пространства:

$ echo "${my_arr[0]}" "${my_arr[1]}" "${my_arr[2]}" "${my_arr[3]}" 
05 21 09 32 
Смежные вопросы