Не только PDO. Если sql ответить как '????' символы, пресеты из вашей кодировки (надежда UTF-8) действительно рекомендуются:
if (!$mysqli->set_charset("utf8"))
{ printf("Can't set utf8: %s\n", $mysqli->error); }
или с помощью стиля процедуры mysqli_set_charset($db,"utf8")
Используйте Perl
$ perl -0777 -lne ' while(/"name":\s+"ABC",\s+"location":\s+(\S+)/msg) { print "$1\n" } ' output.json
"NewYork",
$ cat output.json
{"project": {"id": "A", "content": [{"name": "XYZ", "location": "Berlin", "comments":""}, {"name": "ABC", "location": "NewYork", "comments": "Hwllo"}, {"name": "DEF", "location": "Paris", "comments": "Success"}]}}
$
Для извлечения из json вы должны использовать jq, если можете. По словам авторов, «jq - это как sed для данных JSON» (источник) .
В вашем случае это должно быть:
$ jq -r '.project' output.json | jq -r '.content' | jq '.[] | select(.name=="ABC")' | jq -r '.location'
Вывод будет:
NewYork
Чтобы получить вывод, который вам требуется, так:
"location":"NewYork"
Вы можно использовать:
echo "\"location\":$(jq -r '.project' output.json | jq -r '.content' | jq '.[] | select(.name=="ABC")' | jq '.location')"
Перед тем, как использовать jq, вы должны установить его в Debian и Ubuntu. Это будет:
$ sudo apt install jq
для других ОС, вам следует проверить этот сайт [116 ].
Может быть, есть лучшие способы сделать это, быстрым извращенным способом здесь.
cat output.json | sed 's/"name"/\n"name"/g' | grep '"name"' | awk -F',' '{print $2}'
Добавьте | grep <preferred name>
также, если необходимо отфильтровать по имени.
Пожалуйста, используйте JSON-анализатор для обработки JSON.
С Xidel это так же просто, как:
xidel -s output.json -e '($json//content)()[name="ABC"]/location'
В качестве альтернативы:
xidel -s output.json -e '$json/(.//content)()[name="ABC"]/location'
or in full:
xidel -s output.json -e '$json/project/(content)()[name="ABC"]/location'
Выше приведено обозначение XPath ( пример # 11, чтение JSON ]). Точечная запись (например, jq
) также возможна:
xidel -s output.json -e '($json).project.content()[name="ABC"].location'
[edit]
Приведенные выше команды выдают NewYork
, и я только что понял, что вам требуется вывод будет "location":"NewYork"
. Xidel может сделать это тоже:
xidel -s output.json -e '($json//content)()[name="ABC"]/concat("""location"":""",location,"""")'
[/ edit]