Простой вариант - использовать регулярное выражение для каждой пары ключ-значение вместо одного большого регулярного выражения.
/"name":"((?:[^\\"]|\\.)*)"/
/"memory":(\d+)/
Этот другой параметр не является регулярным выражением, но может быть достаточным.Вместо использования регулярных выражений, вы можете просто преобразовать полученный ответ перед его чтением.Поскольку вы говорите «Мы используем простой завиток» Полагаю, вы говорите об инструменте командной строки Curl.Вы можете передать результат в простую команду Perl .
perl -ne 'use JSON; use Text::CSV qw(csv); $hash = decode_json $_; csv (sep_char=> ";", out => *STDOUT, in => [[$hash->{name}, $hash->{memory}, $hash->{consumer_utilisation}, $hash->{messages_unacknowledged}, $hash->{messages_ready}, $hash->{messages}]]);'
Это позволит сохранить порядок, упрощая использование регулярных выражений для считывания данных.
input
{"name":"queue1","memory":89048,"consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0}
{"name":"queue2","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0,"memory":21944}
{"name":"queue3","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"memory":21944,"messages":0}
output
queue1;89048;;0;0;0
queue2;21944;;0;0;0
queue3;21944;;0;0;0
Для этого вам понадобится Perl и пакеты JSON и Text ::CSV установлен.В моей системе они присутствуют в perl
, libjson-perl
и libtext-csv-perl
.
Примечание: В настоящее время я использую ;
в качестве разделителя.Если это входит в один из выходных будет заключен в двойные кавычки."name":"que;ue1"
=> "que;ue1";89048;;0;0;0
Если значение включает в себя как ;
, так и "
, то "
будет экранирован путем размещения еще одного перед ним."name":"q\"ue;ue1"
=> "q""ue;ue1";89048;;0;0;0