簡單的回答是,你想要做什麼,你不能做什麼。 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
但是,我認爲這裏的外延是你不應該在文件名中使用空格;)
不要使用'seq'。對於((line = 0; line
ormaaj
@ormaaj修正了問題。我想到了一些來自gnuplot的系統調用..就像sed將空格切換爲破折號,然後再次返回。 爲什麼不使用seq(可讀性?!)和全大寫變量名? – Rob