kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Rich Bradshaw
Rich Bradshaw
Вопрос

Исключение символов в bash (для JSON)

Я использую git, затем отправляю сообщение о коммите и другие части в виде JSON на сервер.

В настоящее время у меня есть:

MSG=`git log -n 1 --format=oneline | grep -o ' .\+'`

который устанавливает MSG на что-то вроде:

Calendar can't go back past today

тогда

curl -i -X POST \
  -H 'Accept: application/text' \
  -H 'Content-type: application/json' \
  -d "{'payload': {'message': '$MSG'}}" \
  'https://example.com'

В моем реальном JSON есть еще пара полей.

Это работает нормально, но, конечно, когда у меня есть сообщение о фиксации, такое как выше, с апострофом в нем, JSON становится недействительным.

Как я могу избавиться от символов, требуемых в bash? Я не знаком с этим языком, поэтому не уверен, с чего начать. Замена ' на \' сделает работу как минимум, я подозреваю.

50 2012-04-07T10:28:18+00:00 10
 7ochem
7ochem
Редактировал вопрос 22-го февраля 2016 в 2:12
Программирование
json
escaping
bash
 polm23
polm23
20-го ноября 2012 в 3:25
2012-11-20T03:25:55+00:00
Дополнительно
Источник
Редактировать
#15880719

Использование Python:

Это решение не является чисто Баш, но это'ы неинвазивный и работает с Unicode.

json_escape () {
    printf '%s' "$1" | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))'
}

Обратите внимание, что JSON является частью стандартной библиотеки Python уже в течение длительного времени, так что это довольно минимальный питона зависимостей.

Или с помощью PHP:

json_escape () {
    printf '%s' "$1" | php -r 'echo json_encode(file_get_contents("php://stdin"));'
}

Использовать вот так:

$ json_escape "ヤホー"
"\u30e4\u30db\u30fc"
Charles Duffy
Charles Duffy
Редактировал ответ 26-го апреля 2018 в 9:58
56
0
 chepner
chepner
15-го июля 2012 в 9:27
2012-07-15T21:27:18+00:00
Дополнительно
Источник
Редактировать
#15880718

Вместо того, чтобы беспокоиться о том, как правильно цитировать данные, просто сохраните его в файл и использовать @ конструкции завиток позволяет с опцией --сведения. Чтобы убедиться, что выход ГИТ правильно сбежал для использования в качестве значения JSON, мы используем такой инструмент, как `jq не генерировать JSON-файл, а не создавать его вручную.

jq -n --arg msg "$(git log -n 1 --format=oneline | grep -o ' .\+')" \
   '{payload: { message: $msg }}' > git-tmp.txt

curl -i -X POST \
  -H 'Accept: application/text' \
  -H 'Content-type: application/json' \
  -d @git-tmp.txt \
  'https://example.com'

Вы также можете прочитать непосредственно из стандартного ввода с помощью-д @-; я оставляю это в качестве упражнения для читателя, чтобы построить трубопровод, который читает измерзавеци производит необходимую полезную нагрузку сообщения для загрузки сзавиток`.

(Подсказка: это'ы jq не ... | виться ... -д@- 'https://example.com' )

 ryantm
ryantm
Редактировал ответ 12-го марта 2018 в 11:36
43
0
 jchook
jchook
16-го мая 2018 в 10:18
2018-05-16T22:18:14+00:00
Дополнительно
Источник
Редактировать
#15880725

U в может сделать это.

Легкий, бесплатный, и написанный на C, `jq не пользуется широкой поддержкой сообщества с более чем 15к звезд на GitHub. Я лично считаю, что это очень быстрое и полезным в моей повседневной работе.

Преобразовать строку в JSON

jq -aRs . <<< '猫に小判'

Объяснить,

  • -а означает "ASCII выход"и
  • -Р означает "сырья"и
  • -S означает, что "включить переносы строк"и
  • . означает "выход корня документ JSON"и
  • <<< передает строку в stdin (Баш только?)

ЖКТ + Пример Использования Команды Grep

Исправить пример кода, данные ОП, просто труба через jq не.

MSG=`git log -n 1 --format=oneline | grep -o ' .\+' | jq -aRs .`
 jchook
jchook
Редактировал ответ 21-го октября 2019 в 11:19
18
0
 xsgordon
xsgordon
15-го июля 2012 в 8:59
2012-07-15T20:59:41+00:00
Дополнительно
Источник
Редактировать
#15880717

Я также пытался экранировать символы в Bash для передачи данных с помощью JSON, когда наткнулся на это. Я обнаружил, что на самом деле существует более широкий список символов, которые должны быть экранированы – особенно если вы пытаетесь работать с текстом в свободной форме.

Есть два совета, которые я нашел полезными:

  • Используйте синтаксис Bash ${string//substring/replacement}, описанный в этой теме.
  • Используйте фактические управляющие символы для табуляции, новой строки, возврата каретки и т.д. В vim вы можете ввести их, набрав Ctrl+V, за которым следует фактический управляющий код (Ctrl+I для tab, например).

В результате я придумал следующие замены Bash:

JSON_TOPIC_RAW=${JSON_TOPIC_RAW//\\/\\\\} # \ 
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//\//\\\/} # / 
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//\'/\\\'} # ' (not strictly needed ?)
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//\"/\\\"} # " 
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//   /\\t} # \t (tab)
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//
/\\\n} # \n (newline)
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//^M/\\\r} # \r (carriage return)
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//^L/\\\f} # \f (form feed)
JSON_TOPIC_RAW=${JSON_TOPIC_RAW//^H/\\\b} # \b (backspace)

На данном этапе я еще не придумал, как правильно экранировать символы Unicode, что также (по-видимому) требуется. Я обновлю свой ответ, если разберусь с этим.

Benjamin W.
Benjamin W.
Редактировал ответ 12-го октября 2016 в 4:13
16
0
Решение / Ответ
Rich Bradshaw
Rich Bradshaw
7-го апреля 2012 в 11:10
2012-04-07T11:10:20+00:00
Дополнительно
Источник
Редактировать
#15880716

Хорошо, нашел, что делать. Bash поддерживает это нативно, как и ожидалось, хотя, как всегда, синтаксис не очень-то угадывается!

По сути, ${string//substring/replacement} возвращает то, что вы изобразили, так что вы можете использовать

MSG=${MSG//\'/\\\'}

для этого. Следующая проблема заключается в том, что первый regex больше не работает, но его можно заменить на

git log -n 1 --pretty=format:'%s'

В конце концов, мне даже не понадобилось их экранировать. Вместо этого я просто заменил все ' в JSON на \". Что ж, каждый день чему-то учишься.

11
0
 wcy
wcy
8-го ноября 2016 в 6:34
2016-11-08T06:34:17+00:00
Дополнительно
Источник
Редактировать
#15880722
git log -n 1 --format=oneline | grep -o ' .\+' | jq --slurp --raw-input

Выше линия работает для меня. см https://github.com/stedolan/jq для более U в инструменты

7
0
 m-szalik
m-szalik
20-го февраля 2016 в 12:28
2016-02-20T00:28:16+00:00
Дополнительно
Источник
Редактировать
#15880721

Самый простой способ-использовать [jshon][1], а command строки для разбора, читать и создавать JSON.

jshon -ы &#39;ваши данные сюда.&#39; 2 и GT;/dev/нуль

[1]: http://kmkeen.com/jshon/ то "Jshon и"

Douglas Santos
Douglas Santos
Редактировал ответ 26-го апреля 2018 в 9:55
4
0
 user907860
user907860
7-го апреля 2012 в 10:34
2012-04-07T10:34:45+00:00
Дополнительно
Источник
Редактировать
#15880714

Я нашел что-то подобное:

MSG=`echo $MSG | sed "s/'/\\\\\'/g"`
 7ochem
7ochem
Редактировал ответ 22-го февраля 2016 в 2:11
4
0
Josh Bode
Josh Bode
15-го августа 2017 в 12:29
2017-08-15T00:29:46+00:00
Дополнительно
Источник
Редактировать
#15880724

Это экранирует раствор, используя Perl, который избегает обратной косой черты (\), двойная кавычка (" В) и контрольных символов U+0000 до от U+001F:

$ echo -ne "Hello, 🌵\n\tBye" | \
  perl -pe 's/(\\(\\\\)*)/$1$1/g; s/(?!\\)(["\x00-\x1f])/sprintf("\\u%04x",ord($1))/eg;'
Hello, 🌵\u000a\u0009Bye
0
0
 KirillDE
KirillDE
18-го марта 2017 в 2:05
2017-03-18T14:05:29+00:00
Дополнительно
Источник
Редактировать
#15880723

У меня была такая же идея, чтобы отправить сообщение с коммита после фиксации. Сначала я пробовал подобное, как автор здесь. Но потом нашла лучше и проще решение.

Просто создал php файл, который посылает сообщение и вызвать его с командой wget. в hooks/пост-получите :

wget -qO - "http://localhost/git.php" 

в git.php:

chdir("/opt/git/project.git");
$git_log = exec("git log -n 1 --format=oneline | grep -o ' .\+'");

А затем создать JSON и Curl для вызова в стиле РНР

0
0
Похожие сообщества 1
pro.bash
pro.bash
511 пользователей
All about Nix shells, signals, processes and development in general.
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 2 дня назад
2
Денис Васьков
Зарегистрирован 3 дня назад
3
Dima Patrushev
Зарегистрирован 6 дней назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией