簡體   English   中英

將字符串拆分為數組(以“\\”分隔)

[英]Split string into array (delimited by “\ ”)

我目前正在編寫一個 bash 腳本。 假設我有以下字符串:

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

此字符串可以包含未知數量的窗口位置。 現在我需要在每個位置的末尾將字符串拆分為一個數組,因此每個位置在數組中都有自己的鍵。 主要問題是每個路徑(程序文件)中的空格。

到目前為止我嘗試過的:

使用 IFS 變量:

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

這里的問題是,它削減了每個反斜杠上的位置,而不僅僅是預期的反斜杠和空格。 所以C:是我數組的第一個元素。

使用讀取命令:

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

和以前一樣的問題。

關於如何解決這個問題的任何想法?

編輯:我不是在使用真正的 bash,而是在 Windows 上使用 git bash。 所以並不是每個 bash 命令都可用。

你可以使用這個腳本:

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

或非 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}'))

可能沒有文件名包含選項卡,以下將起作用:

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

在不太可能的情況下,文件名確實包含制表符,您可以將上面的制表符更改為其他內容,例如\\1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM