#!/bin/sh - # # Oliver Fromme # # BSD-style copyright and standard disclaimer applies. # # Dies ist ein einfaches Skript, das deutsche Reime ermittelt. # Es laeuft unter FreeBSD und erfordert den Port de-dict # (/usr/ports/german/dict). # # Der Algorithmus zum Ermitteln der Reime ist ziemlich simpel, # funktioniert aber in den meisten Faellen zufriedenstellend. # export PATH=/bin:/usr/bin:/usr/sbin export LC_CTYPE=de_DE.ISO8859-1 PREFIX_INFO=$(pkg_info -pq de-dict\*) DICT=${PREFIX_INFO##* }/share/ger-eng.txt DEBUG=false SUFFIX_ONLY=false FORCE_RESHAPE=false MAX_LENGTH=100 Usage() { cat <<-tac >&2 1. Syntax: ${0##*/} [-d] Sucht Reime auf das angegebene (deutsche) Wort. Bitte Umlaute als ä, ö, ü schreiben (nicht ae, oe, ue). In der Ausgabe erscheinen Umlaute allerdings als ae, oe, ue. Bei -d wird der ermittelte Suffix ausgegeben (zum Debuggen). 2. Syntax: ${0##*/} -s Sucht Worte mit dem angegebenen Suffix. tac exit } while [ "x${1#-}" != "x$1" ]; do for OPT in $(echo "$1" | sed 's/./& /g'); do case "$OPT" in -) ;; d) DEBUG=true;; s) SUFFIX_ONLY=true;; r) FORCE_RESHAPE=true;; m) MAX_LENGTH="$2"; shift;; h|H|\?) Usage;; *) echo "${0##*/}: Unbekannte Option -$OPT" >&2 exit 1 ;; esac done shift done case "$MAX_LENGTH" in ""|*[!0-9]*) echo "${0##*/}: Ungültige Maximallänge \"$MAX_LENGTH\"" >&2 exit 1 ;; esac if [ $# -ne 1 -o -z "$1" -o "x${1#-}" != "x$1" ]; then Usage fi if [ ! -r $DICT ]; then echo "${0##*/}: Wörterbuch nicht gefunden: $DICT" >&2 echo "Bitte de-dict installieren: /usr/ports/german/dict" >&2 exit 1 fi U="[AEIOUaeiouÄÖÜäöü]" # Umlaute V="[^AEIOUaeiouÄÖÜäöü]" # Vokale PREPEND_VOC=false if $SUFFIX_ONLY; then SUFFIX="$1" else if expr "x$1" : ".*$V\$" && ! expr "x$1" : "x.*${V}e[lnrt]\$"; then SUFFIX=$(expr "x$1" : ".*$V\($U$U*$V$V*\)\$") if [ -z "$SUFFIX" ]; then SUFFIX=$(expr "x$1" : ".*\($U$U*$V$V*\)\$") fi else SUFFIX=$(expr "x$1" : ".*$V\($U$U*$V*$U$V*\)\$") if [ -z "$SUFFIX" ]; then SUFFIX=$(expr "x$1" : ".*\($U$U*$V*$U\)\$") fi fi >/dev/null if [ -n "$SUFFIX" ]; then PREPEND_VOC=true elif [ ${#1} -gt 2 ]; then SUFFIX="$1" fi fi if [ -z "$SUFFIX" ]; then echo "${0##*/}: Kann Suffix nicht ermitteln (Wort zu kurz)." >&2 exit 1 fi SUFFIX=$(echo "$SUFFIX" | sed 's/[Ää]/ae/g;s/[Öö]/oe/g;s/[Üü]/ue/g;s/ß/ss/g') if $PREPEND_VOC; then SUFFIX="(^|$V)$SUFFIX" fi if $DEBUG; then echo "SUFFIX = \"$SUFFIX\"" >&2 fi if $FORCE_RESHAPE || [ -t 1 ]; then RESHAPE=rs else RESHAPE=cat fi # # We use two egreps in a pipe, for efficiency. # The first egrep pre-filters the dictionary, so the sed command # sees only a very small part of the file. This is because sed # is much slower than egrep. # egrep -i "$SUFFIX([^A-Za-z]|\$)" $DICT \ | sed 's/:.*//' \ | tr ' \t,;.:/!?()[]' '\n' \ | egrep -i "$SUFFIX\$" \ | awk "(length(\$0) <= $MAX_LENGTH)" \ | sort -u \ | $RESHAPE #--