使用linux shell中的任何命令提取文本

时间:2016-06-21 09:16:45

标签: linux bash shell sed grep

如何从以下文本中提取文本并将其存储到变量中:

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}')

我需要一个更清晰的解决方案或简短的解决方案。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您的代码存在许多问题。

  • 您不能仅使用k$k的值传输到标准输出 - 您想要printf '%s\n' "$k"或者可能不太便携echo "$k"
  • 另请注意上述表达中的引用;没有它,shell将对值
  • 执行通配符扩展和空白标记化
  • 产生两个用于简单字符串替换的Awk进程过多
  • 为要提取的每个值生成单独的管道效率低下;如果可能的话,一次性提取所有内容。

IFS=':-, '; set -- $k之类的内容会将部分分配到$1$2$3$4