繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM