Я хочу select() объект на основе строки, содержащей переменную jq ($ARCH), используя аргумент -arg jq. Вот пример использования при поиске "/bin/linux/$ARCH/kubeadm" в Google ...

# You may need to install `xml2json` IE 
# sudo gem install --no-rdoc --no-ri xml2json and run the script I wrote to do the xml2json:

#!/usr/bin/ruby
# Written by Jim Conner
require 'xml2json'

xml = ARGV[0]

begin
  if xml == '-'
    xdata = ARGF.read.chomp
    puts XML2JSON.parse(xdata)
  else
    puts XML2JSON.parse(File.read(file2parse).chomp)
  end
rescue => e
  $stderr.puts 'Unable to comply: %s' % [e.message]
end

Затем запустите следующее:

curl -sSL https://storage.googleapis.com/kubernetes-release/ > /var/tmp/k8s.xml | \
xml2json - | \
jq --arg ARCH amd64 '[.ListBucketResult.Contents[] | select(.Key | contains("/bin/linux/$arch/kubeadm"))]'

... который возвращает пустой набор, потому что jq не транслитерируется внутри кавычек. Я знаю, что могу обойти это, используя несколько select / contains (), но я бы предпочел не делать этого, если это возможно.

jq может просто этого не делать, но если кто-то знает, как это сделать, я буду очень признателен.

0
Jim 5 Окт 2018 в 22:33

1 ответ

Лучший ответ

Jq поддерживает интерполяцию строк, и в вашем случае строка будет:

"/bin/linux/\($ARCH)/kubeadm"

Обратите внимание, что это не строка JSON: появление "\(" сигнализирует о том, что строка подлежит интерполяции. Очень здорово.

(В качестве альтернативы вы, конечно, можете использовать конкатенацию строк: "/bin/linux/" + $ARCH + "/kubeadm")

Кстати, вы можете избежать здесь contains. Его семантика довольно сложна и, возможно, противоречит интуиции. Рассмотрите возможность использования startswith, index или (для совпадений регулярных выражений) test.

3
peak 5 Окт 2018 в 20:10