Wie verwende ich xargs und sed, um die Ergebnisse an ein Array weiterzuleiten?

688
Chad Cooper

Ich ziehe JSON von einem REST-Endpunkt mit curl und analysiere ihn dann mit dem Knotenpaket json, um einige der JSON-Attribute abzurufen, die ich später in einigen App-Konfigurationen verwende.

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

..was gibt:

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 

Perfekt. Was ich aber wirklich brauche, sind diese in einem Array, wie zum Beispiel:

["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"] 

Ich fand einen Befehl mit xargs und sed und hackte ihn, um mich teilweise dorthin zu bringen:

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' 

... was gibt:

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 

Außerdem muss ich unbedingt auch die Aliasdaten abrufen können:

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 

Mein xargs / sed-Befehl bricht hier zusammen, da in den Aliasnamen Leerzeichen stehen:

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' 

Wie Sie sehen, trennt es jedes Wort durch Leerzeichen, nicht was ich brauche.

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 

... und hier versagt mir mein xargs / sed foo. Ich bin mir nicht sicher, ob es sich um eine Xargs-Sache oder eine Sed-Sache handelt und ob ich einen Regex zum Sed übergeben muss, um mit den möglichen Leerzeichen in den Aliasnamen fertig zu werden. Gibt es einen Befehl xargs / sed, der mir die Ergebnisse für Namen und Aliase in der obigen Array-Form liefert?

2

3 Antworten auf die Frage

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"]ist die Regex-Capture-Gruppe, die in Anführungszeichen und eckige Klammern eingeschlossen ist. So erhalten Sie eine Liste von Arrays, die jeweils ein einzelnes aliasElement enthalten :

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

Dann fasst der json -gWille alle diese Mini-Arrays in einem einzigen zusammen:

["foo bar", "baz quux"]

Eine kleine Erklärung würde Ihre Antwort verbessern Dave M vor 8 Jahren 0
1
NighttimeDriver50000

Wenn Sie Python haben, ist eine einfache Lösung:

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])' 

was gibt:

['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'] 

Wenn Sie doppelte Anführungszeichen benötigen:

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' 

was gibt:

["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"] 
Dies hat mich letztendlich dazu inspiriert, Python dafür zu verwenden, etwa wie folgt: Layer_Name = Subprozess.check_output ("curl -s / ? F = pjson | json -a name" .format (service_url, layer_number) , shell = True) `. Chad Cooper vor 8 Jahren 0
0
quantum

Versuchen Sie es mit 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' 

Gibt:

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