Синтаксис при наличии пробела в ключе

Это сводит меня с ума.

У меня есть JSON, который выглядит так:

{
"gateways": [
    {
        "DHCP": "On",
        "External IPs": "46.244.46.66",
        "Firewall": "On",
        "NAT": "Off",
        "Name": "gateway",
        "Routed Networks": "photon, default-routed-network",
        "Selected": "*",
        "Syslog": "",
        "Uplinks": "d5p6v51-ext",
        "VPN": "Off"
    }
]
}

Я могу легко извлечь значения для большинства ключей.

E.g.

jq --raw-output .gateways[0].Name
gateway

Однако мне действительно нужно получить значение "External IPs", и я не могу понять, как управлять пространством.

Я старался

jq --raw-output .gateways[0].'External IPs'

jq --raw-output .gateways[0].`External IPs`

jq --raw-output .gateways[0]."External IPs"

Но ни один из них не работает.

Любой намек?


jq
person mreferre    schedule 13.11.2015    source источник


Ответы (2)


Используйте цитирование, как в:

jq --raw-output '.gateways[0]."External IPs"'
person Hans Z.    schedule 13.11.2015
comment
Также стоит упомянуть, что в оболочке вы всегда должны цитировать фильтр, чего не делал OP. - person Jeff Mercado; 13.11.2015
comment
В более старых версиях jq, где этот синтаксис не разрешен, вы можете использовать .gateways[0]["External IPs"] - person ; 13.11.2015
comment
Спасибо @JeffMercado и @santiago-lapesta, но ни один из этих двух синтаксисов мне не подходит. Я получаю compile error либо при [, либо при ", в зависимости от того, какой из двух я пробую. - person mreferre; 14.11.2015
comment
Кстати, не уверен, что это имеет значение, но я объединяю эту команду для заполнения массива шлюзов (например, vca -j gateway | jq --raw-output '.gateways[0]."External IPs"') - person mreferre; 14.11.2015

Хорошо, я понял это.

В конце концов, то, что предложил @JeffMercado, сработало. Проблема в том, что apt-get install jq установить jq версии 1.3. Пришлось вручную обновить jq (до 1.5) и тогда заработало.

Спасибо!

person mreferre    schedule 14.11.2015