2017-08-25 99 views
0

我有一個看起來像這樣如何編輯多行使用腳本

"gpu_thread_num" : 6, 

"gpu_threads_conf" : [ 
    { "index" : 0, "intensity" : 1000, "worksize" : 8, "affine_to_cpu" : false }, 
    { "index" : 1, "intensity" : 1000, "worksize" : 8, "affine_to_cpu" : false }, 
    { "index" : 2, "intensity" : 1000, "worksize" : 8, "affine_to_cpu" : false }, 
    { "index" : 3, "intensity" : 1000, "worksize" : 8, "affine_to_cpu" : false }, 
    { "index" : 4, "intensity" : 1000, "worksize" : 8, "affine_to_cpu" : false }, 
    { "index" : 5, "intensity" : 1000, "worksize" : 8, "affine_to_cpu" : false }, 
], 

在「gpu_threads_conf」行數配置文件必須始終等於「gpu_thread_num」,這NUM改變不時取決於連接的GPU數量。 我有一個start.sh腳本來檢查這個數字,用sed改變「gpu_thread_num」,但我不知道如何改變「gpu_threads_conf」。

我失去了我的希望試圖找出如何自己做,真的需要你的幫助。

+0

而不是修改文件,爲什麼不每次重新創建它? –

+0

@ IgnacioVazquez-Abrams它太大,包含更復雜的東西。 – kusayu

+1

如果文件是JSON,請考慮使用'jq'來處理它。 – Barmar

回答

1

如果您想更新的數量「gpu_thread_num」根據行數,你可以使用下面的腳本:

#!/bin/sh 

#Take the first line 
idx=$(grep -n gpu_threads_conf "$1") 
#line after gpu_thread... 
START=$(($(echo "$idx" | sed "s|:.*||"))) 

idx2=$(grep -n "]," "$1") 
END=$(($(echo "$idx2" | sed "s|:.*||") - 1)) 

#Returns 3 
echo $START 

#returns 9 
echo $END 

#returns 6 
RESULT=$(($END - $START)) 

#substitute the number in the file 
sed -i "s|\"gpu_thread_num\" :.*|\"gpu_thread_num\" : $RESULT,|" $1 

將直接更新你的配置文件...

sh Test.sh MyConf.cfg 

我希望能與一個或其他解決方案,你會發現你的幸福:)

+0

這是一個完美的解決方案,它非常漂亮,我不能停下來來回運行,哈哈。這就是爲什麼我慢慢接受和讚揚它。非常感謝,你真棒! – kusayu

0

我不知道已經明白很好,但你可以嘗試這樣的事:

#!/bin/sh 


echo "\"gpu_threads_conf\" : [ " > TOTO.txt 
END=6 
for i in $(seq 2 $END); do 
    echo "$i" 
    echo  "{ \"index\" : $i, \"intensity\" : 1000, \"worksize\" : 8, \"affine_to_cpu\" : false }," >> TOTO.txt 
done 
echo "]," >> TOTO.txt 

結果:

$ cat TOTO.txt 
"gpu_threads_conf" : [ 
{ index : 1, intensity : 1000, worksize : 8, affine_to_cpu : false }, 
{ index : 2, intensity : 1000, worksize : 8, affine_to_cpu : false }, 
{ index : 3, intensity : 1000, worksize : 8, affine_to_cpu : false }, 
{ index : 4, intensity : 1000, worksize : 8, affine_to_cpu : false }, 
{ index : 5, intensity : 1000, worksize : 8, affine_to_cpu : false }, 
{ index : 6, intensity : 1000, worksize : 8, affine_to_cpu : false }, 
], 

只要使用END以「gpu_thread_num」的號碼,我就是這樣。

我希望我能很好地理解這個問題。

問候 托馬斯

+0

由於某種原因,它不適合我。 kusayu @ laptop:〜/ oc_nv.sh $ ./foo.sh ./foo.sh:5:./foo.sh:語法錯誤:對於循環變量 – kusayu

+0

也不好,shellcheck也會報告錯誤。 – kusayu

+0

它使用/ bin/bash而不是sh。現在,我可以每次從配置文件中刪除「gpu_threads_conf」,並使用答案中的代碼將其恢復。非常感謝你。 – kusayu