我正在尝试根据“ ##” 字符分割字符串。挑战在于“#” 的出现次数并不总是2。我有时最多可以出现5次。
如果是像'##'或'###'这样的静态事件,我会使用:
IFS="##" read -ra var1 <<< "$var"
这是我的字符串:
Strin1##String2###String3##String4#####String5
目前,我正在关注IFS="##"
,稍后删除所有出现的'#'。但是,我正在寻找一种支持此功能的代码方法。
答案 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