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
\
次のように空白プレフィックスを追加してみましたFiles.txt
。
TestApp/Resources/Supporting\ Files/main.m
そして%20
次のように:
TestApp/Resources/Supporting%20Files/main.m
不運!
答え1
for
ループ反復性格行ではない- 常にあなたのコメントを引用してください
"$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/Internal_field_separator
この$IFS
変数は入力がトークンに分割される方法を定義し、デフォルトではスペース、タブ、および改行が使用されます。改行にのみ分割したいので、$IFS
この変数を一時的に変更する必要があります。