[英]regex usage in shell script
使用A节中的shell脚本,我得到了B节中所示的输出。 但是,期望/期望的输出如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
尽管不是在这种情况下达到期望结果的唯一(或最佳)方法,但作为使用正则表达式分割值的一般方法,您可以这样:
#!/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
有什么原因不能直接从您拥有的值中直接初始化关联数组?
#!/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
(关联数组的性质是,通常不会按您放置的顺序打印值。如果这是一个主要问题,则可以使用两个常规数组。)
通过使用字段分隔符( 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
两个变量。
请注意,您需要在数据中添加尾部分号,否则最后一条记录将被丢弃。
#!/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
我不确定是否需要使用数组。 如果不是,那么单线解决方案将是:
echo $a | tr ";" "\n" | awk -F\- '{ print "var "NR" is : "$1" and version is "$2 }'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.