Dividindo `Arquivo` e `nome do diretório com espaço' via shell script

Dividindo `Arquivo` e `nome do diretório com espaço' via shell script

Eu tenho um arquivo chamado Files.txtcom o seguinte conteúdo:

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

Estou extraindo nomes de arquivos e diretórios conforme a seguir e passando-os para outro processo.

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

No entanto, isso está me deixando assim:

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

O que eu preciso é disso:

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

Tentei prefixar o espaço com \in Files.txtcomo:

TestApp/Resources/Supporting\ Files/main.m

e com %20como:

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

sem sorte!

Responder1

  1. forloops iterampalavrasnão linhas
  2. sempre cite o seu "$variables"(a menos que você saiba exatamente quando não fazê-lo)
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

Responder2

Você precisa definir o separador de campos:

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

Saída:

[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

Explicação: http://en.wikipedia.org/wiki/Internal_field_separator

A $IFSvariável define como a entrada é dividida em tokens e o padrão é espaço, tabulação e nova linha. Como você deseja dividir apenas em novas linhas, a $IFSvariável precisa ser alterada temporariamente.

informação relacionada