如何使用脚本编辑多行

时间:2017-08-25 22:55:16

标签: bash

我有一个看起来像这样的配置文件

"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"并且这个数字随时间变化取决于连接的GPU的数量。 我有一个start.sh脚本来检查这个数字并更改" gpu_thread_num"与sed,但我无法弄清楚如何改变" gpu_threads_conf"。

我失去了我的希望,试图弄清楚如何自己做,真的需要你的帮助。

2 个答案:

答案 0 :(得分: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

我希望通过一个或其他解决方案,你能找到你的快乐:)

答案 1 :(得分: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和#34; gpu_thread_num"我想是的。

我希望我能理解这个问题。

此致 托马斯