我一直在寻找一个解决方案,发现了类似的问题,只是他们试图在句子之间用空格分割句子,而答案并不适用于我的情况。

当前,一个变量被设置为这样的字符串: 中的- 123456 我想把它分成两个变量,同时去掉“-”。例如: var1 =中的 var2 = 123456

怎么可能做到这一点呢?


这是对我有效的解决方案: var1=$(echo $STR | cut -f1 -d-) var2=$(echo $STR | cut -f2 -d-)

是否有可能使用cut命令在没有分隔符的情况下工作(每个字符都被设置为变量)?

var1=$(echo $STR | cut -f1 -d?) var2=$(echo $STR | cut -f1 -d?) var3=$(echo $STR | cut -f1 -d?) 等。


如果你的解决方案不必是一般的,即只需要工作的字符串像你的例子,你可以这样做:

var1=$(echo $STR | cut -f1 -d-)
var2=$(echo $STR | cut -f2 -d-)

我在这里选择了cut,因为你可以简单地为更多的变量扩展代码……


如果你知道它将只有两个字段,你可以像这样跳过额外的子过程,使用:

var1=${STR%-*}
var2=${STR#*-}

这有什么用?${STR%-*}从字符串末尾开始删除$STR中匹配pattern -*的最短子字符串。${STR#*-}做同样的事情,但是使用*-模式,并且从字符串的开头开始。它们都有对应的%%和##,用于查找最长的锚定模式匹配。如果任何人有一个有用的助记符来记住哪个做哪个,让我知道!我总是两种都试着记住。

有关更多信息,请参阅bash文档。


使用bash regex功能:

re="^([^-]+)-(.*)$"
[[ "ABCDE-123456" =~ $re ]] && var1="${BASH_REMATCH[1]}" && var2="${BASH_REMATCH[2]}"
echo $var1
echo $var2

输出

ABCDE
123456

听起来像一个工作设置自定义IFS。

IFS=-
set $STR
var1=$1
var2=$2

(你会想要在一个带有本地IFS的函数中做到这一点,这样你就不会把脚本中需要IFS的其他部分弄乱了。)


要用-分隔字符串,你可以使用read和IFS:

$ IFS=- read -r var1 var2 <<< ABCDE-123456
$ echo "$var1"
ABCDE
$ echo "$var2"
123456

编辑:

下面是如何将每个单独的字符读入数组元素:

$ read -ra foo <<<"$(echo "ABCDE-123456" | sed 's/./& /g')"

转储数组:

$ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]="-" [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'

如果字符串中有空格:

$ IFS=$'\v' read -ra foo <<<"$(echo "ABCDE 123456" | sed $'s/./&\v/g')"
$ declare -p foo
declare -a foo='([0]="A" [1]="B" [2]="C" [3]="D" [4]="E" [5]=" " [6]="1" [7]="2" [8]="3" [9]="4" [10]="5" [11]="6")'