インラインコマンドにファイル名があることを確認してください。

インラインコマンドにファイル名があることを確認してください。

次の内容を含む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

関連情報