我有一个名为 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"
。您需要$(...)
像其他引用一样引用$variable
,并且您可能想要删除"
s。
[ -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