如何对基于相同字符串的同一字符的多次出现进行定界

时间:2019-02-10 07:36:19

标签: shell

我正在尝试根据“ ##” 字符分割字符串。挑战在于“#” 的出现次数并不总是2。我有时最多可以出现5次。

如果是像'##''###'这样的静态事件,我会使用:

IFS="##" read -ra var1 <<< "$var" 

这是我的字符串:

Strin1##String2###String3##String4#####String5 

目前,我正在关注IFS="##",稍后删除所有出现的'#'。但是,我正在寻找一种支持此功能的代码方法。

2 个答案:

答案 0 :(得分:1)

bash具有parameter transformation运算符可帮助调试以下问题:

var='Strin1##String2###String3##String4#####String5'
IFS="##" read -ra var1 var2 var3 var4 var5 var6 <<< "$var"
echo ${var1[@]@A}

...使用A ssignment 运算符来打印declare语句,以显示数组$var1中的真正

declare -a var1=([0]="Strin1" [1]="" [2]="String2" [3]="" [4]="" [5]="String3" [6]="" [7]="String4" [8]="" [9]="" [10]="" [11]="" [12]="String5")

共有 13个项目,它们与#字符串中的十二个 $var的每个“边”相对应。这是因为$IFS变量不理解用户分配的字符串,它仅查看字符串中的那些单个字符。因此,IFS="#######"IFS="##"IFS="#"都是等效的,至少就read而言。

最简单的解决方法是首先通过$var squeeze 函数运行tr,以删除重复的#

var='Strin1##String2###String3##String4#####String5'
IFS="#" read -ra var1 var2 var3 var4 var5 var6 <<< "$(tr -s '#' <<< "$var")"
echo ${var1[@]@A}

哪个输出:

declare -a var1=([0]="Strin1" [1]="String2" [2]="String3" [3]="String4" [4]="String5")

答案 1 :(得分:-1)

您可以在IFS上使用正则表达式

IFS="##[#]*" read -ra var1 <<< "Strin1##String2###String3##String4#####String5"

打印var1数组时,您会得到

Strin1 String2 String3 String4 String5