Экранирование символов Markdown2

Подскажите, как правильно задать экранирование символов в Markdown_v2. Пишу скрипт, который через Github Action отправляет в телеграм бота уведомление, если встретилась та или иная ошибка в коде. Уже все перепробовал, но не удается отправка, вечная ошибка с некорректным экранированием

- name: Notify via Telegram
  run: |
    set -x
    if [[ -z "${{ secrets.TELEGRAM_BOT_TOKEN }}" ]] || [[ -z "${{ secrets.TELEGRAM_CHAT_ID }}" ]]; then
      echo "ERROR: Telegram secrets not configured"
      exit 1
    fi

    TIMESTAMP=$(TZ=Europe/Moscow date +"%H:%M, %d.%m.%Y")
    ERR_MSG=""
    CHANGES_MSG=""
    ERRORS=0

    send_telegram_error() {
      local logfile="$1"
      local filename="$2"
    
      if [[ -s "$logfile" ]]; then
        local error_text=$(head -20 "$logfile" | sed 's/^/- /' \
        | sed 's/\\/\\\\/g' \
        | sed 's/\./\\./g' \
        | sed 's/_/\\_/g' \
        | sed 's/\*/\\*/g' \
        | sed 's/\[/\\[/g' \
        | sed 's/\]/\\]/g' \
        | sed 's/(/\\(/g' \
        | sed 's/)/\\)/g' \
        | sed 's/~/\\~/g' \
        | sed 's/`/\\`/g' \
        | sed 's/>/\\>/g' \
        | sed 's/#/\\#/g' \
        | sed 's/+/\\+/g' \
        | sed 's/-/\\-/g' \
        | sed 's/=/\\=/g' \
        | sed 's/|/\\|/g' \
        | sed 's/{/\\{/g' \
        | sed 's/}/\\}/g' \
        | sed 's/!/\\!/g')
        local message="*❌ Ошибка при проверке нормативов*
    ? Время: \`$TIMESTAMP\`
    ? Файл: $filename
    ? Ошибка:
    \`\`\`
    $error_text
    \`\`\`"
        curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
          -d chat_id="${{ secrets.TELEGRAM_CHAT_ID }}" \
          -d parse_mode="MarkdownV2" \
          --data-urlencode "text=$message"
        ERRORS=1
      fi
    }
    
    send_telegram_error "error_all_norms.log" "scripts/check_all_norms.py"
    send_telegram_error "error_wpf_wbf.log" "scripts/check_wpf_wbf_blocks.py"

    if [[ $ERRORS -eq 1 ]]; then
      exit 1
    fi
    print('q')
    CHANGES=""
    if git diff HEAD~1 --name-only 2>/dev/null | grep -q .; then
      CHANGES=$(git diff HEAD~1 --name-only 2>/dev/null)
    fi
    print(CHANGES)
    CHANGES_LIST=$(echo "$CHANGES" | sed 's/^/- /' | sed 's/[_*[\]()~`>#+=|{}.!-]/\\&/g' | sed 's/^- /\\- /' | sed 's/\./\\./g' | sed 's/_/\\_/g')
    
    ERRORS_MSG=""
    if [[ -s error_all_norms.log ]] || [[ -s error_wpf_wbf.log ]]; then
      ERRORS_MSG="❌ Обнаружены ошибки при проверке нормативов"
    fi
    
    if [[ -z "$CHANGES" ]]; then
      if [[ -z "$ERRORS_MSG" ]]; then
        MESSAGE="*?️ Проверка нормативов завершена*
        ? Время: \`$TIMESTAMP\`
        ❌ Изменения не обнаружены"
      else
        MESSAGE="*?️ Проверка нормативов завершена*
        ? Время: \`$TIMESTAMP\`
        ❌ Изменения не обнаружены
        $ERRORS_MSG"
      fi
    else
      if [[ -z "$ERRORS_MSG" ]]; then
        MESSAGE="*?️ Обнаружены обновления нормативов*
        ? Время: \`$TIMESTAMP\`
        ? Изменённые файлы: $CHANGES_LIST"
      else
        MESSAGE="*?️ Обнаружены обновления нормативов*
        ? Время: \`$TIMESTAMP\`
        ? Изменённые файлы: $CHANGES_LIST
        $ERRORS_MSG"
      fi
    fi
    
    echo "Sending message: $MESSAGE"
    echo "CHANGES_LIST preview:"
    echo "$CHANGES_LIST" | head -3
    curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage \
      -d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \
      -d parse_mode=MarkdownV2 \
      --data-urlencode "text=$MESSAGE"
  env:
    TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
    TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}

Ответы (0 шт):