将字符串拆分为数组(由“\”分隔)

时间:2014-09-11 14:22:43

标签: arrays bash shell

我正在编写一个bash脚本。我们假设我有以下字符串:

C:\Program Files\Folder1\ C:\Program Files\Folder2\ C:\Program Files\Folder3\ 

此字符串可包含未知数量的窗口位置。 现在我需要将字符串拆分为每个位置末尾的数组,因此每个位置在数组中都有自己的键。主要问题是每个路径中的空格(Program Files)。

到目前为止我尝试过:

使用IFS变量:

oldIFS="$IFS"
IFS="\ "
myArray=( $myString )
IFS="$oldIFS"

这里的问题是,它会削减每个反斜杠上的位置,而不仅仅是反斜杠和空格。所以C:是我的数组的第一个元素。

使用读取命令:

IFS="\ " read -ra myArray "$myString"

与以前一样的问题。

关于如何解决这个问题的任何想法?

编辑:我没有使用真正的bash,而是在Windows上使用git bash。所以不是每个bash命令都可用。

2 个答案:

答案 0 :(得分:1)

您可以使用此脚本:

s='C:\Program Files\Folder1\ C:\Program Files\Folder2\ C:\Program Files\Folder3\'
IFS='^K' read -ra arr < <(sed 's/\\ /^K/g' <<< "$s")

OR非BASH

echo "$s" | sed 's/\\ /^K/g' | IFS='^K' read -ra arr

<强>测试

declare -p arr
declare -a arr='([0]="C:\\Program Files\\Folder1" [1]="C:\\Program Files\\Folder2" [2]="C:\\Program Files\\Folder3\\")'

PS:此处^K实际上是 Control V K


您还可以使用awk

echo "$s" | awk -F '\\\\( |$)' '{for (i=1; i<=NF; i++) if ($i) print $i}'
C:\Program Files\Folder1
C:\Program Files\Folder2
C:\Program Files\Folder3

对于数组创建:

IFS=';' arr=($(echo "$s" | awk -F '\\\\( |$)' -v ORS=';' '{for (i=1; i<=NF; i++) 
     if ($i) print $i}'))

答案 1 :(得分:0)

可能没有文件名包含选项卡,以下内容将起作用:

IFS=$'\t' read -ra the_files <<<"${the_string//\\ /$'\\\t'}"

如果文件名确实包含标签,则可以将上方的标签字符更改为其他内容,例如\1