
Tengo un archivo llamado Files.txt
que tiene el siguiente contenido:
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files/AppDelegate.m
Extraigo los nombres de archivos y directorios de la siguiente manera y los paso a otro proceso.
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
Sin embargo, esto me está dando esto:
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
Lo que necesito es esto:
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
Intenté anteponer el espacio con \
in Files.txt
como:
TestApp/Resources/Supporting\ Files/main.m
y con %20
como:
TestApp/Resources/Supporting%20Files/main.m
sin suerte!
Respuesta1
for
los bucles se repitenpalabrasno lineas- cite siempre su
"$variables"
(a menos que sepa exactamente cuándo no hacerlo)
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
Respuesta2
Debe configurar el 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
Producción:
[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
Explicación: http://en.wikipedia.org/wiki/Internal_field_separator
La $IFS
variable define cómo se divide la entrada en tokens y el valor predeterminado es espacio, tabulación y nueva línea. Como desea dividir solo en nuevas líneas, la $IFS
variable debe cambiarse temporalmente.