Разделение `Файла` и `Имени каталога с пробелом` с помощью скрипта оболочки

Разделение `Файла` и `Имени каталога с пробелом` с помощью скрипта оболочки

У меня есть файл Files.txtсо следующим содержимым:

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files/AppDelegate.m

Я извлекаю имена файлов и каталогов следующим образом и передаю их другому процессу.

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)

  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

Однако это приводит меня к следующему:

TestApp/Resources/Supporting
TestApp/Resources

Files/main.m
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.h
Files

TestApp/Resources/Supporting
TestApp/Resources

Files/AppDelegate.m
Files

Мне нужно вот это:

TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

Я попробовал добавить префикс пробела \in следующим Files.txtобразом:

TestApp/Resources/Supporting\ Files/main.m

и с %20как:

TestApp/Resources/Supporting%20Files/main.m

безуспешно!

решение1

  1. forциклы повторяютсясловане линии
  2. всегда цитируйте свои "$variables"(если только вы точно не знаете, когда этого делать не следует)
while read -r item ; do    
  dn=$(dirname "$item")

  printf "%s\n" "$item"
  printf "%s\n" "$dn"

  # pass "$item" and "$dn" to another process
done < Files.txt

решение2

Вам необходимо установить разделитель полей:

OIFS=$IFS  
IFS=$'\n'

files=$(cat Files.txt)

for item in $files ; do    
  dn=$(dirname $item)
  printf $item
  printf "\n"
  printf $dn
  printf "\n\n"

  # passing to another process
done

IFS=$OIFS

Выход:

[me@localhost test]$ ./test.sh 
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files

TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files

Объяснение: http://en.wikipedia.org/wiki/Внутренний_разделитель_полей

Переменная $IFSопределяет, как ввод разделяется на токены, и по умолчанию это пробел, табуляция и новая строка. Поскольку вы хотите разделить только по новым строкам, переменную $IFSнужно временно изменить.

Связанный контент