次の内容を含むinput.txtというファイルがあります。
...
ファイル "Edie - Realities.txt" TXT
...
私はそれを読み、FILEで始まる行からファイル名パスを削除し、それが存在することを確認したいと思います。
[ -f $(cat input.txt | grep FILE | grep -o "\".*\"") ] && echo "exist" || echo "does not exist"
ただし、これは次のように出力されます。
[: too many arguments
does not exist
私が実行した場合:
echo $(cat input.txt | grep FILE | grep -o "\".*\"")
私は私が期待したものを得ます:
"Edie - Realities.txt"
それでは、なぜこれが起こり、どのように解決できますか?
答え1
引数を引用する必要があります-f
。実行すると、set -x
実行中のコマンドに[ -f '"Edie' '-' 'Realities.txt"' ]
引数が多すぎることがわかります。
[ -f "$(sed -e '/FILE/!d' -e 's/FILE "\([^"]*\).*/\1/' input.txt)" ]
システムにGNU grepがある場合は、次のものを使用できます。
[ -f "$(grep -Po '(?<=FILE ").*(?=")' input.txt)" ]
答え2
$(...)
"Edie
明らかに、-
およびを別々のパラメータとして渡しますRealities.txt"
。$(...)
他のものと同様に引用する必要があり、sを$variable
削除することもできます。"
[ -f "$(cat input.txt | grep FILE | sed 's/^.*"\(.*\)".*$/\1/')" ] && echo "exist" || echo "does not exist"
答え3
あなたのファイルコンテンツについて
FILE "/path_to_file/filename" TXT
次のようなことをする
grep FILE input.txt | while read line
do
fname=`echo $line | awk -F\" '{print $2}'` # this separates the line by the quotes
# result is like /path_to_file
echo $fname # just to check it
if [ -f $fname ]
then
ls -l $fname
echo "file exists"
else
echo "no file there $file"
fi
done