2

Я извлекаю JSON из конечной точки REST, используя curl, а затем анализирую его, используя пакет узлов json, чтобы получить некоторые атрибуты JSON, которые я использую позже в некоторых конфигурациях приложения.

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a name

..который дает:

OBJECTID
SHAPE
FACILITYID
ACCOUNTID
METSERVICE
SERVICETYPE
INSTALLDATE
LOCDESC
ROTATION
LOCATIONID
CRITICAL
ENABLED
ACTIVEFLAG
OWNEDBY
MAINTBY
LASTUPDATE
LASTEDITOR
BILLINGNAME
SERVICECODE
CYCLECODE
RATETABLE
SERVICESIZE
REMSERIALNUMBER
METERMULTIPLIER
LONGITUDE
LATITUDE
METERPULL

Отлично. Но что мне действительно нужно, это поместить их в массив, такой как:

["OBJECTID", "SHAPE", "FACILITYID", "ACCOUNTID", "METSERVICE", 
 "SERVICETYPE", "INSTALLDATE", "LOCDESC", "ROTATION", "LOCATIONID", 
 "CRITICAL", "ENABLED", "ACTIVEFLAG", "OWNEDBY", "MAINTBY", "LASTUPDATE", 
 "LASTEDITOR", "BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE",
 "SERVICESIZE", "REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", 
 "LATITUDE", "METERPULL"]

Я нашел команду, использующую xargs и sed, и взломал ее, чтобы частично попасть туда:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a name | xargs echo | sed 's/ /", "/g'

...который дает:

OBJECTID", "SHAPE", "FACILITYID", "ACCOUNTID", "METSERVICE", "SERVICETYPE", 
"INSTALLDATE", "LOCDESC", "ROTATION", "LOCATIONID", "CRITICAL", "ENABLED", 
"ACTIVEFLAG", "OWNEDBY", "MAINTBY", "LASTUPDATE", "LASTEDITOR", 
"BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE", "SERVICESIZE", 
"REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL

Кроме того, мне действительно нужно иметь возможность получать данные псевдонимов:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias

OBJECTID
SHAPE
Facility Identifier
Account Number
Metered Service
Service Type
Install Date
Location Description
Rotation
Location Identifier
CriticalCustomer
Enabled
Active Flag
Owned By
Managed By
Last Update Date
Last Editor
BILLINGNAME
SERVICECODE
CYCLECODE
RATETABLE
SERVICESIZE
REMSERIALNUMBER
METERMULTIPLIER
LONGITUDE
LATITUDE
METERPULL

Моя команда xargs/sed не работает, так как в псевдонимах есть пробелы:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | xargs echo | sed 's/ /", "/g'

Как видите, каждое слово разделяется пробелами, а не тем, что мне нужно.

OBJECTID", "SHAPE", "Facility", "Identifier", "Account", "Number", 
"Metered", "Service", "Service", "Type", "Install", "Date", "Location", 
"Description", "Rotation", "Location", "Identifier", "CriticalCustomer", 
"Enabled", "Active", "Flag", "Owned", "By", "Managed", "By", "Last", 
"Update", "Date", "Last", "Editor", "BILLINGNAME", "SERVICECODE", 
"CYCLECODE", "RATETABLE", "SERVICESIZE", "REMSERIALNUMBER", 
"METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL

... и вот где мой xargs/sed foo подводит меня. Я не уверен, что это xargs или sed, и мне нужно передать регулярное выражение в sed, чтобы разобраться с возможными пробелами в псевдонимах. Есть ли команда xargs/sed, которая может дать мне результаты для имен и псевдонимов в форме массива выше?

3 ответа3

2
$ curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | sed 's/\(.*\)/["\1"]/g' | json -g

["\1"] - это группа захвата регулярных выражений, заключенная в кавычки и квадратные скобки - так вы получите список массивов, каждый из которых содержит один элемент alias , например:

["foo bar"] ["baz quux"]

Затем json -g сгруппирует все эти мини-массивы в один:

["foo bar", "baz quux"]

1

Если у вас есть Python, простое решение:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | python -c 'import sys;print([line.strip() for line in sys.stdin])'

который дает:

['OBJECTID', 'SHAPE', 'Facility Identifier', 'Account Number', 'Metered Service', 'Service Type', 'Install Date', 'Location Description', 'Rotation', 'Location Identifier', 'CriticalCustomer', 'Enabled', 'Active Flag', 'Owned By', 'Managed By', 'Last Update Date', 'Last Editor', 'BILLINGNAME', 'SERVICECODE', 'CYCLECODE', 'RATETABLE', 'SERVICESIZE', 'REMSERIALNUMBER', 'METERMULTIPLIER', 'LONGITUDE', 'LATITUDE', 'METERPULL']

Если вам нужны двойные кавычки:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | python -c 'import sys;print([line.strip() for line in sys.stdin])' | sed 's/'"'"'/"/g'

который дает:

["OBJECTID", "SHAPE", "Facility Identifier", "Account Number", "Metered Service", "Service Type", "Install Date", "Location Description", "Rotation", "Location Identifier", "CriticalCustomer", "Enabled", "Active Flag", "Owned By", "Managed By", "Last Update Date", "Last Editor", "BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE", "SERVICESIZE", "REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL"]
0

Попробуйте использовать perl:

curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | perl -pe 's/\n/", "/g'

дает:

OBJECTID", "SHAPE", "Facility Identifier", "Account Number", "Metered Service", "Service Type", "Install Date", "Location Description", "Rotation", "Location Identifier", "CriticalCustomer", "Enabled", "Active Flag", "Owned By", "Managed By", "Last Update Date", "Last Editor", "BILLINGNAME", "SERVICECODE", "CYCLECODE", "RATETABLE", "SERVICESIZE", "REMSERIALNUMBER", "METERMULTIPLIER", "LONGITUDE", "LATITUDE", "METERPULL

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .