Kashi Vishwa
Kashi Vishwa

Reputation: 121

Use Sed to find and replace json field

I have set of json files where after last key value pair i have comma which needs to be replaced.

{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime":"0.033",
}

It should look like:

{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime": 0.033
}

How can i achive this using sed. Edit: Changed output - There should not be any "" around 0.033.

sed -i  \'7i'\\t'\"EchoTime\": \0.033\' sub-285345_task-WM_acq-RL_bold.json

is not helping me. I have tried few other options but no success..

I trioed using simplejson and json package in python too. But given that the files are incorrct json, json.loads(file) throws errors..

I would prefer sed over python for now..

Upvotes: 2

Views: 2982

Answers (3)

P....
P....

Reputation: 18351

In case you are not limited to sed and open for awk , then following can be used :

awk ' BEGIN{FS=OFS=":"}/EchoTime/ {gsub(/\"|\,/,"",$2)}1'  file.json
{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime":0.033
}

Explanation:

FS=OFS=":" : This will set input and o/p field separator as ":"

/EchoTime/ : Search for the line containing EchoTime.

/EchoTime/{gsub(/\"|\,/,"",$2)}: Once echo time is found use global sub to replace , double quotes and comma in second field of that line.

1 : awk's default action is to print.

For making changes in original file:

awk ' BEGIN{FS=OFS=":"}/EchoTime/ {gsub(/\"|\,/,"",$2)}1'  file.json >json.tmp && mv json.tmp file.json

Upvotes: 0

sjsam
sjsam

Reputation: 21955

 sed -Ei.bak 's/^([[:blank:]]*"EchoTime[^"]*":)"([^"]*)",$/\1\2/' file.json

will do it

Sample Output

{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime":0.033
}

Notes

  • E to enable extended regular expressions.
  • i to enable inplace editing, a backup file with .bak extension is created.

Upvotes: 2

gzh
gzh

Reputation: 3596

Please try the following command.

sed -i 's#\(.*\)EchoTime":"\(.*\)",$#\1EchoTime":\2#' sub-285345_task-WM_acq-RL_bold.json

Upvotes: 0

Related Questions