使用bash查找并替换json文件中的值

时间:2018-10-07 14:00:05

标签: json bash

我有几个与此类似的.json文件。

{
    "AcquisitionNumber": 1,
    "TotalReadoutTime": 0.035,
    "IntendedFor": "func/sub-02_task-rest_run-01_bold.nii.gz"
}

我想使用bash变量在“ IntendedFor”行中更改子编号,循环遍历不同的子。例如,如果sub为03:

sub=03
echo $sub
03

如何使用此bash变量将sub-02的值更改为sub-03

4 个答案:

答案 0 :(得分:3)

使用

jq --arg sub "$sub" '.IntendedFor |= sub("(?<=sub-)[^_]+"; $sub)' file

请参见this online example

请注意,您的jq二进制文件必须使用正则表达式支持进行编译才能使用sub函数。

而且,您可以使用for循环和临时文件来实现内联编辑:

sub=03

for jsonfile in *.json; do
    tempfile=$(mktemp -u)
    jq --arg sub "$sub" '.IntendedFor|=sub("(?<=sub-)[^_]+";$sub)' "$jsonfile" > "$tempfile"
    mv "$tempfile" "$jsonfile"
done

答案 1 :(得分:1)

使用jq和bash:

value=$(jq -r '.IntendedFor' file)
new_value="${value/sub-02/sub-03}"
jq --arg new "$new_value" '.IntendedFor |= $new' file

输出:

{
  "AcquisitionNumber": 1,
  "TotalReadoutTime": 0.035,
  "IntendedFor": "func/sub-03_task-rest_run-01_bold.nii.gz"
}

答案 2 :(得分:1)

使用spongemoreutils的一部分):

for f in *.json; do
  jq --arg sub "$sub" '.IntendedFor |= sub("/sub-[^_]+";"/sub-"+$sub)' "$f" | sponge "$f"
done

无论如何,一个简单的正则表达式就足够了。

Windows海绵

请参阅:

答案 3 :(得分:-1)

有更好的方法,但是有一个bash解决方案:

#!/bin/bash
fromstring="sub-02"
tostring="sub-03"

while read line; do
    case "$line" in
    (*IntendedFor*) echo $(line/$fromstring/$tostring) ;;
    (*)  echo $line ;;
    esac
 done < JSONfile