2014-09-11 4 views
1

В настоящее время я пишу сценарий 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, а git bash на окнах. Поэтому не каждая команда bash доступна.

+0

Нет, потому что компьютеры не психические. –

+0

'bash' и' Windows' с путями стиля 'Windows'? –

+0

Мой плохой, я отредактировал строку, так что теперь должно быть ясно, что я хочу делать. – JoelP

ответ

1

Вы можете использовать этот скрипт:

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

ИЛИ Non-Баш

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

Testing:

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

PS: Здесь ^K на самом деле управленияVK


Вы также можете использовать 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}')) 
+0

Это дает мне две разные ошибки: 'не может сделать трубку для замещения процесса: функция не реализована' и' неоднозначная перенаправление' - вероятно, потому, что я использую git bash для окон, а не для реального bash? – JoelP

+0

oh ok вы можете использовать: 'echo '$ s" | sed 's/\\/^ K/g' | IFS = '^ K' read -ra arr'. – anubhava

+0

См. Мой обновленный ответ. – anubhava

0

Вероятно, имя файла не содержит вкладку, и следующие wi Л.Л. работа:

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

В маловероятном случае, что имя файла действительно содержит вкладки, вы можете изменить символ табуляции выше чем-то другим, как \1.

+0

Это прекрасно работает ... но только для первого элемента. Окончательный массив состоит только из одного элемента ('C: \ Program Files \ Folder1 \') - любая идея? – JoelP

+0

@JoelP: Как вы печатаете последний массив? Вам нужно использовать 'printf% s \\ n $ {the_files [@]}' или 'declare -p the_files', чтобы увидеть его значения. – rici

+0

Ну, используя ваш код printf, я получаю только 'C: \ Program [linebreak] Files \ Folder1' в качестве вывода (замените [linebreak] на реальный linebreak). – JoelP

Смежные вопросы