Используйте jq:
$ echo $a | jq '.[][0]["**DATA_DATE**"]'
"2017-03-09 00:00:00"
Поскольку jq может быть доступен не во всех дистрибутивах, и вы можете не захотеть компилировать его самостоятельно, вы можете воспользоваться преимуществами многих других языков сценариев, которые имеют поддержку JSON в своих базовых библиотеках.
Перл:
$ perl -e "use JSON::Parse 'parse_json'; my \$a = parse_json ('$(echo $a)'); print \$a->{'content'}[0]{'**DATA_DATE**'}"
2017-03-09 00:00:00
Питон:
$ python -c "import json; a=json.loads('$(echo $a)'); print(a['content'][0]['**DATA_DATE**'])"
2017-03-09 00:00:00
Рубин:
$ ruby -e "require 'json'; puts JSON.parse('$a')['content'][0]['**DATA_DATE**'];"
2017-03-09 00:00:00
Конечно, вы можете (ab )использовать стандартные инструменты *nix (GNU )для получения значений из этого конкретного примера JSON, но это действительно неудобно. Вы можете занять первую строку. Как только структура JSON изменится, ваш код будет вести себя непредсказуемо.
Конвейерный код в zsh
запускает этот код в отдельном процессе. Этот процесс не имеет ваших интерактивных настроек, таких как псевдонимы и функции (, он не читает.zshrc
)и не имеет переменных оболочки и другого состояния текущей оболочки. Состояние этого другого процесса, например текущего каталога, теряется при завершении этого процесса.
Чтобы выполнить код в текущем процессе оболочки, передайте его как аргумент (, а не как ввод )встроенной функции eval
.
eval "$(<~/.zsh_history cut -d ';' -f 2 | sk --tac)"
Но для этого конкретного случая выбора записи истории есть и другой способ. Встроенная функцияfc
. Следующая команда запускает функцию fcedit_sk
с одним аргументом — именем временного файла. При вызове функции файл содержит все записи истории.(${${(kn)history}[1]}
— индекс самой старой записи, а -1
— самая новая запись ). Когда функция возвращается, zsh выполняет все, что содержится в файле, как если бы вы ввели его в командной строке.
fc -e fcedit_sk ${${(kn)history}[1]} -1
Сделайте fcedit_sk
функцией, которая вызывает sk
для содержимого файла и записывает свои выходные данные обратно в файл. Я не знаю sk
, поэтому я не знаю, есть ли способ проще, чем этот:
fcedit_sk () {
local output
output=$(sk --tac <$1)
if (($?)); then
echo >|$1 # Cancelled
else
print -lr -- $output >|$1
fi
}