Извлечение содержимого пути / компонентов имени файла (BASH) - PullRequest
0 голосов
/ 14 марта 2019

У меня есть имена файлов, из которых я пытаюсь извлечь имена / слова / цифры для дальнейшего использования.

например,

/.../Penguins_45_MIA.txt
/.../Sheep_3.5_KIA.txt
/.../Dolphins_19_AWOL.txt

Как видите, в именах файлов есть разделенные подчеркиванием компоненты, которые мне полезны.Я помещаю их в массив ("currentpath"), а затем в цикл, обрабатывая каждый файл по одному (я думаю, что это довольно разумный подход?).Я пытался использовать следующую команду, чтобы разбить путь на составляющие слова и цифры:

partialpath=(${currentpath//_/})

, а затем выбрал часть имени (теперь элемент), например, животное, используя что-то вродеэто:

${partialpath[-3]}

Но это не работает - я надеялся, что эхо из вышеперечисленного даст мне Dolphins или Penguins и т. д. Когда я исследовал, echo "${partialpath[@]}" вернул:

/.../Dolphins19AWOL.txt

Итак, я предполагаю, что массив имеет только один элемент?Это значит, что весь путь к файлу склеен без каких-либо подчеркиваний?Или я неправильно выбираю элементы?

Кроме того, я только что заметил, что этот последний элемент по-прежнему оставляет файл .txt, заканчивающийся на последнем элементе, что будет неоптимальным.

Надеюсьэто понятно, я знаю, что это простая проблема, но я совершенно новичок в написании сценариев и целый день чесал голову.

1 Ответ

0 голосов
/ 14 марта 2019

${currentpath//_/} только что удалил подчеркивание, строка не разбивается.Он может использоваться для массивов, но выполняет те же манипуляции со строками для каждого элемента.Попробуйте это:

$: cat x
/.../Penguins_45_MIA.txt
/.../Sheep_3.5_KIA.txt
/.../Dolphins_19_AWOL.txt

while read line
do tmp="${line##*/}" # remove ALL path stuff from the line 
   tmp="${tmp%.*}"   # remove JUST LAST piece after a dot
   IFS="_" read -a chunk <<< "$tmp"; # split on underscores
   printf "%10s " "${chunk[@]}"; printf "\n"; 
done < x
  Penguins         45        MIA
     Sheep        3.5        KIA
  Dolphins         19       AWOL
...