題 如何解析由字符串中的空格分隔的文件路徑?


背景:我在Automator上使用命令行實用程序的包裝器。我需要一種方法來將單個空格分隔的任意數量的文件路徑與單個字符串分開,這樣我就可以刪除除第一個文件路徑之外的所有文件路徑以傳遞給程序。

示例輸入字符串:

/Users/bobby/diddy dum/ding.mp4 /Users/jimmy/gone mia/come back jimmy.mp3 ...

期望的輸出:

/Users/bobby/diddy dum/ding.mp4

部分問題是Automator結束時的不靈活性。我正在使用Automator操作,它返回由空格(或逗號)分隔的未轉義POSIX文件路徑。這是不幸的,因為:1。我無法確保文件/文件夾名稱不包含空格或逗號,以及2. Mac OS X文件名中唯一不允許的字符(據我所知)是 :。有些選項允許我將文件路徑用雙引號或單引號或尖括號括起來。程序本身接受上述輸入字符串的參數,因此必須有一種分離路徑的方法。我只是沒有足夠的眼光看到如何做到這一點 sed 要么 awk

起初我以為我會用 sed 替換每一個 [space]/ 同 [newline]/ 然後修剪除第一行以外的所有行,但這會為名稱以空格結尾的文件夾打開漏洞。如果我使用逗號分隔符,則會發生相同的情況,僅代替逗號。如果我封裝在雙引號或單引號中,我會為具有這些字符的文件名打開另一罐蠕蟲。

這是我的Automator工作流程的相關部分:

image/link

- 更新 -

我以一種相當迂迴的方式實現了我想要的東西。它不是很優雅,但這裡是工作通用代碼:

path="/Users/bobby/diddy dum/ding.mp4 /Users/jimmy/gone mia/come back jimmy.mp3"

# using colon because it's an inadmissible Mac OS X
# filename character, perfect for separating
# also, unlike [space], multiple colons do not collapse
IFS=:

# replace all spaces with colons
colpath=$(echo "$path" | sed 's/ /:/g')

# place words from colon-ized file path into array
# e.g. three spaces -> three colons -> two empty words
j=1
for word in $colpath
do
    filearray[$j]="$word"
    j=$j+1
done

# reconstruct file path word by word
# after each addition, check file existence
# if non-existent, re-add lost [space] and continue until found
name=""
for seg in "${filearray[@]}"
do
    name="$name$seg"
        if [[ -f "$name" ]]
        then
            echo "$name"
            break
        fi
    name="$name "
done

所有這些麻煩都是因為默認的IFS不會將空格之間的“空虛”計算為單詞,而是將它們全部折疊起來。


4
2017-09-18 00:10


起源


請將您的解決方案作為答案發布 - 您可以在一天左右的時間內接受。 - ChrisF


答案:


此shell代碼將連接輸入的段,直到它們形成有效的文件(路徑)名稱:

文件=“”
九月=“”
$ path中的單詞
做
    文件=“$文件$ $九月單詞”
    if [[-f“$ file”]]
    然後
        打破
    科幻
    sep =“”
DONE
echo“first file:'$ file'”

這假定命名文件已經存在(並且您的腳本可以“看到”它們;即,可以搜索它們所在的目錄),如果名稱包含多個連續的空格,它仍然會失敗(例如,“diddy dum“還可以,但是”diddy  dum“ 不是)。


1
2017-09-18 00:40



謝謝,我沒想到用shell中的單詞拆分它。我將嘗試解決的唯一問題是多個空間的限制,但我想我會以迂迴的方式做到這一點,首先用字符串中的冒號替換空格,將IFS設置為冒號,然後它將留下空字(與崩潰的空間不同)當我將字符串作為參數傳遞時,我可以將其轉回空間。 - user1130637