我在bash中有一个小脚本,它通过gnuplot生成图形。 一切正常,直到输入文件的名称包含空格。
这就是我所拥有的:
INPUTFILES=("data1.txt" "data2 with spaces.txt" "data3.txt")
...
#MAXROWS is set earlier, not relevant.
for LINE in $( seq 0 $(( MAXROWS - 1 )) );do
gnuplot << EOF
reset
set terminal png
set output "out/graf_${LINE}.png"
filenames="${INPUTFILES[@]}"
set multiplot
plot for [file in filenames] file every ::0::${LINE} using 1:2 with line title "graf_${LINE}"
unset multiplot
EOF
done
此代码有效,但输入文件名称中只有空格。
在示例中,gnuplot评估此:
1 iteration: file=data1.txt - CORRECT
2 iteration: file=data2 - INCORRECT
3 iteration: file=with - INCORRECT
4 iteration: file=spaces.txt - INCORRECT
答案 0 :(得分:1)
快速回答是你无法完全按照自己的意愿去做。 Gnuplot在一个迭代中将字符串拆分为空格,并且没有办法(AFIK)。根据您的需要,可能会有“解决方法”。您可以在gnuplot中编写一个(递归)函数来将字符串替换为另一个 -
#S,C & R stand for STRING, CHARS and REPLACEMENT to help this be a little more legible.
replace(S,C,R)=(strstrt(S,C)) ? \
replace( S[:strstrt(S,C)-1].R.S[strstrt(S,C)+strlen(C):] ,C,R) : S
奖励指向任何能够在没有递归的情况下弄清楚如何做到这一点的人......
然后你的(bash)循环看起来像:
INPUTFILES_BEFORE=("data1.txt" "data2 with spaces.txt" "data3.txt")
INPUTFILES=()
#C style loop to avoid changing IFS -- Sorry SO doesn't like the #...
#This loop pre-processes files and changes spaces to '#_#'
for (( i=0; i < ${#INPUTFILES_BEFORE[@]}; i++)); do
FILE=${INPUTFILES_BEFORE[${i}]}
INPUTFILES+=( "`echo ${FILE} | sed -e 's/ /#_#/g'`" ) #replace ' ' with '#_#'
done
预处理输入文件,将“#_#”添加到其中包含空格的文件名中......最后,“完整”脚本:
...
INPUTFILES_BEFORE=("data1.txt" "data2 with spaces.txt" "data3.txt")
INPUTFILES=()
for (( i=0; i < ${#INPUTFILES_BEFORE[@]}; i++)); do
FILE=${INPUTFILES_BEFORE[${i}]}
INPUTFILES+=( "`echo ${FILE} | sed -e 's/ /#_#/g'`" ) #replace ' ' with '#_#'
done
for LINE in $( seq 0 $(( MAXROWS - 1 )) );do
gnuplot <<EOF
filenames="${INPUTFILES[@]}"
replace(S,C,R)=(strstrt(S,C)) ? \
replace( S[:strstrt(S,C)-1].R.S[strstrt(S,C)+strlen(C):] , C ,R) : S
#replace '#_#' with ' ' in filenames.
plot for [file in filenames] replace(file,'#_#',' ') every ::0::${LINE} using 1:2 with line title "graf_${LINE}"
EOF
done
但是,我认为这里的内容是你不应该在文件名中使用空格;)
答案 1 :(得分:0)
逃离空间:
"data2\ with\ spaces.txt"
修改强>
似乎即使使用转义序列,正如您所提到的,bash for
将始终解析空格上的输入。
您可以将脚本转换为while
循环方式:
http://ubuntuforums.org/showthread.php?t=83424
这也可能是一个解决方案,但对我来说这是新的,我还在玩它以确切了解它在做什么:
http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html