#!/usr/bin/env bash # ============================================================ # synonyme.sh — deutsche Synonyme im Terminal nachschlagen. # # Fragt OpenThesaurus (openthesaurus.de) und gibt die Treffer # als Liste aus. Liest nur, ändert nichts am System. # # Hinweis: Das Suchwort wird an openthesaurus.de übertragen. # # Autor: Matthias Meister — https://scripts.web.mm-core.de # Lizenz: MIT — Copyright (c) 2026 Matthias Meister # Volltext: https://scripts.web.mm-core.de/lizenz/ # Version: 1.0.0 # ============================================================ set -euo pipefail VERSION="1.0.0" API="https://www.openthesaurus.de/synonyme/search" TIMEOUT=10 LIMIT=0 # 0 = alle PLAIN=0 # 1 = ein Synonym pro Zeile RAW=0 # 1 = rohe JSON-Antwort ausgeben usage() { cat <<'EOF' synonyme.sh — deutsche Synonyme nachschlagen (Quelle: openthesaurus.de). Verwendung: synonyme.sh WORT [WORT ...] Optionen: --limit N Nur die ersten N Treffer --plain Ein Synonym pro Zeile (gut für Pipes und Skripte) --raw Die rohe JSON-Antwort ausgeben --version Version ausgeben -h, --help Diese Hilfe Beispiele: synonyme.sh Haus synonyme.sh --limit 5 schnell synonyme.sh --plain Datei | fzf Als Shell-Funktion (in ~/.bashrc): syn() { /usr/local/bin/synonyme.sh "$@"; } Exit-Code: 0 Treffer gefunden 1 kein Treffer oder Dienst nicht erreichbar 2 Aufruffehler Datenschutz: Das Suchwort geht per HTTPS an openthesaurus.de. Die Daten dort stehen unter CC-BY-SA — bei Weiterverwendung Quelle nennen. EOF } die() { printf 'FEHLER: %s\n' "$1" >&2; exit 1; } # ---- Argumente ---------------------------------------------- WORDS=() while [[ $# -gt 0 ]]; do case "$1" in --limit) LIMIT="${2:?--limit braucht eine Zahl}"; shift ;; --plain) PLAIN=1 ;; --raw) RAW=1 ;; --version) printf 'synonyme.sh %s\n' "$VERSION"; exit 0 ;; -h|--help) usage; exit 0 ;; --) shift; WORDS+=("$@"); break ;; -*) printf 'Unbekannte Option: %s\n\n' "$1" >&2; usage >&2; exit 2 ;; *) WORDS+=("$1") ;; esac shift done [[ "${#WORDS[@]}" -gt 0 ]] || { usage >&2; exit 2; } [[ "$LIMIT" =~ ^[0-9]+$ ]] || die "--limit braucht eine Zahl." command -v curl >/dev/null || die "curl nicht gefunden (apt install curl)." QUERY="${WORDS[*]}" # ---- Abfrage ------------------------------------------------- # --data-urlencode übernimmt die Kodierung — wichtig für Umlaute und Leerzeichen. RESPONSE=$(curl -fsSG --max-time "$TIMEOUT" \ --data-urlencode "q=${QUERY}" \ --data "format=application/json" \ "$API" 2>/dev/null) || die "OpenThesaurus nicht erreichbar." if [[ "$RAW" -eq 1 ]]; then printf '%s\n' "$RESPONSE" exit 0 fi # ---- Auswerten ----------------------------------------------- # Absichtlich ohne jq: das Paket ist auf einem frischen Debian nicht # installiert, und für "term"-Felder reicht grep vollkommen. mapfile -t TERMS < <( printf '%s' "$RESPONSE" \ | grep -o '"term":"[^"]*"' \ | cut -d'"' -f4 \ | grep -vixF "$QUERY" \ | awk '!seen[$0]++' ) if [[ "${#TERMS[@]}" -eq 0 ]]; then printf 'Keine Synonyme gefunden für: %s\n' "$QUERY" >&2 exit 1 fi if [[ "$LIMIT" -gt 0 && "$LIMIT" -lt "${#TERMS[@]}" ]]; then TERMS=("${TERMS[@]:0:$LIMIT}") fi if [[ "$PLAIN" -eq 1 ]]; then printf '%s\n' "${TERMS[@]}" exit 0 fi # Kommagetrennt, an die Terminalbreite umgebrochen — aber nur, wenn die # Ausgabe wirklich in einem Terminal landet. In einer Pipe wäre der # Umbruch nur störend. LINE=$(printf '%s, ' "${TERMS[@]}") LINE="${LINE%, }" if [[ -t 1 ]] && command -v tput >/dev/null && COLS=$(tput cols 2>/dev/null) && [[ "$COLS" -gt 20 ]]; then printf '%s\n' "$LINE" | fold -s -w "$COLS" else printf '%s\n' "$LINE" fi