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

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

5
задан Chad Cooper
источник

3 ответов

если у вас есть 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"]
1
отвечен NighttimeDriver50000 2016-03-09 02:25:37
источник
$ curl -s http://52.71.126.196/arcgis/rest/services/WaterNetwork/MapServer/0?f=pjson | json -a fields | json -a alias | sed 's/\(.*\)/[""]/g' | json -g

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

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

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

["foo bar", "baz quux"]

2
отвечен lobsteropteryx 2016-03-09 12:47:52
источник

попробуйте использовать 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
0
отвечен quantum 2016-03-09 02:10:30
источник

Другие вопросы bash command-line json sed xargs