我正在编写一个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命令都可用。
答案 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
。