shell脚本中的正则表达式用法

时间:2017-04-12 10:37:18

标签: arrays bash shell

使用Section-A中的shell脚本,我得到输出,如Section-B所示。但是,预期/期望的输出如Section-C所示。需要帮助修改代码以获得所需的输出。

A部分:Shell脚本

#!/usr/local/bin/bash

i=0
a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"

IFS="[;]" read -r -a arr <<< "1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
#printf '%s\n' "${arr[@]}"

for chip in "${arr[@]}"
do
    echo " var $((i++)) is : $chip"
done

B部分:上述代码的输出

 var 0 is : 1234-A1
 var 1 is : 1235-A2
 var 2 is : 2345-B1
 var 3 is : 5678-C2
 var 4 is : 2346-D5

C部分:期望的输出是:

var 0 is : 1234 and version is A1
var 1 is : 1235 and version is A2
var 2 is : 2345 and version is B1
var 3 is : 5678 and version is C2
var 4 is : 2346 and version is D5

5 个答案:

答案 0 :(得分:0)

作为使用正则表达式分割值的一般方法,即使不是在这种情况下实现所需结果的唯一(或最佳)方法,您也可以这样:

#!/bin/bash

a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
declare -i i=0

IFS=";" read -a records <<<"$a"

for record in "${records[@]}"
do
  [[ $record =~ (.*)-(.*) ]] || continue
  echo "var $((i++)) is ${BASH_REMATCH[1]} and version is ${BASH_REMATCH[2]}"
done

答案 1 :(得分:0)

您是否有任何理由不直接从您拥有的值初始化关联数组?

#!/bin/bash

declare -rgA arr=([1234]=A1 [1235]=A2 [2345]=B1 [5678]=C2 [2346]=D5)

i=0
for chip in "${!arr[@]}"
do
    echo "var $((i++)) is $chip and version is ${arr[$chip]}"
done

演示:http://ideone.com/Ef9T9P

(关联数组的性质使得这些值通常不会按照您输入的顺序打印。如果这是一个主要问题,可以使用两个常规数组。)

答案 2 :(得分:0)

使用字段分隔符(IFS)和read的分隔符选项,只使用一个read命令,即可获得所需的结果。

#!/bin/bash

a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5;"
declare -i i=0

while IFS="-" read -d ";" -r chip version
do
  echo "var $((i++)) is $chip and version is $version"
done <<<"$a"

将分号视为记录分隔符,将IFS视为如何分割记录中的字段。每个记录read读取两个变量。

请注意,您需要在数据中添加尾部分号,否则最后一条记录将被丢弃。

答案 3 :(得分:0)

#!/usr/local/bin/bash

i=0
a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"

IFS="[;]" read -r -a arr <<< "1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
#printf '%s\n' "${arr[@]}"

for chip in "${arr[@]}"
do
    echo " var $((i++)) is : $chip"
    echo "var $((i++)) is : ${chip%-*} and version is ${chip#*-}"
done

输出:

var 0 is : 1234 and version is A1
var 1 is : 1235 and version is A2
var 2 is : 2345 and version is B1
var 3 is : 5678 and version is C2
var 4 is : 2346 and version is D5

答案 4 :(得分:0)

我不确定使用数组是否是先决条件。如果不是,那么一线解决方案就是:

echo $a | tr ";" "\n" | awk -F\- '{ print "var "NR" is : "$1" and version is "$2 }'