Как использовать xargs и sed для передачи результатов в массив?

675
Chad Cooper

Я извлекаю 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, которая может дать мне результаты для имен и псевдонимов в форме массива выше?

2

3 ответа на вопрос

2
lobsteropteryx
$ 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"]

Небольшое объяснение улучшит ваш ответ Dave M 8 лет назад 0
1
NighttimeDriver50000

Если у вас есть 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"] 
В конечном итоге это вдохновило меня на использование Python, что-то вроде `layer_name = subprocess.check_output (" curl -s / ? F = pjson | json -a name ".format (service_url, layer_number)) , shell = True). Chad Cooper 8 лет назад 0
0
quantum

Попробуйте использовать 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 

Похожие вопросы