我有几个与此类似的.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
?
答案 0 :(得分:3)
使用jq:
jq --arg sub "$sub" '.IntendedFor |= sub("(?<=sub-)[^_]+"; $sub)' file
请注意,您的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)
使用sponge
(moreutils
的一部分):
for f in *.json; do
jq --arg sub "$sub" '.IntendedFor |= sub("/sub-[^_]+";"/sub-"+$sub)' "$f" | sponge "$f"
done
无论如何,一个简单的正则表达式就足够了。
请参阅:
答案 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