
Eu tenho um arquivo chamado Files.txt
com 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.txt
como:
TestApp/Resources/Supporting\ Files/main.m
e com %20
como:
TestApp/Resources/Supporting%20Files/main.m
sem sorte!
Responder1
for
loops iterampalavrasnão linhas- 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 $IFS
variá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 $IFS
variável precisa ser alterada temporariamente.