Bash 如何使用脚本编辑多行

Bash 如何使用脚本编辑多行,bash,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, "intens

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

"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线程配置”中的行数必须始终等于“gpu线程数”,并且此数会根据连接的gpu的数量不时更改。 我有一个start.sh脚本,它检查这个数字并用sed更改“gpu线程数”,但我不知道如何更改“gpu线程数”


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

我不确定是否理解得很好,但你可以尝试这样的东西:

#!/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线程数”,我想就是这样了

我希望我能很好地理解这个问题

问候
Thomas

如果要根据行数更新“gpu线程数”,可以使用以下脚本:

#!/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

<我希望通过一个或其他的解决方案,你会发现你的快乐:

而不是修改文件,为什么每次都不重新创建它?@ IGANACIOVAZKZ AbRAMS它太大了,包含了更复杂的东西。如果文件是JSON,考虑使用<代码> JQ来处理它。@ Barmar,不幸的是,它看起来像JSON,但它不是。刚刚注意到数组最后一个元素后面的逗号。这是Javascript允许的,但不是JSON。出于某种原因,它对我不起作用。kusayu@laptop:~/oc_nv.sh$./foo.sh./foo.sh:5:./foo.sh:语法错误:循环变量不好它与/bin/bash一起工作而不是sh。现在我可以每次从配置文件中删除“gpu线程\u conf”,并使用您答案中的代码将其放回原处。非常感谢。这是一个完美的解决方案,它如此美丽,以至于我无法停下来来回运行它,哈哈。这就是为什么我这么慢地接受和投票的原因。非常感谢,你太棒了!