Frage

Ich bin auf der Suche nach dem besten Weg, eine einfache Eingabe zu übernehmen:

echo -n "Enter a string here: "
read -e STRING

und reinigt durch Entfernen von nicht-alphanumerische Zeichen, niedriger (Fall), und ersetzen Sie Leerzeichen mit Unterstrichen auf.

Ist um Materie? Ist tr der besten / einzige Weg, um dies zu realisieren?

War es hilfreich?

Lösung

Wie dj_segfault weist darauf hin, kann die Schale für Sie die meisten tun. Sieht aus wie Sie auf etwas zurückgreifen müssen werden extern für untere Gehäuse die Zeichenfolge, though. Dazu haben Sie viele Möglichkeiten, wie die Perl-Einzeiler oben, etc., aber ich denke, tr ist wahrscheinlich die einfachste.

# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`

Die Reihenfolge ist hier etwas wichtig. Wir wollen loswerden Unterstrichen bekommen, und ersetzen Sie Leerzeichen mit Unterstrichen, also müssen wir sicher sein erstes unterstreicht abzustreifen. Durch Warten Dinge passieren bis zum Ende tr, wissen wir, haben wir nur alphanumerische Zeichen und unterstreicht, und wir können keine Leerzeichen sicher, wir haben sein, so dass wir tun müssen, um sich keine Sorgen über Sonderzeichen von der Shell interpretiert werden.

Andere Tipps

Bash können dies tun, alles auf seine eigene, ich danke Ihnen sehr. Wenn Sie an dem Abschnitt des Mannes Seite schauen auf Parameter Expansion , werden Sie sehen, dass die bash hat eingebaute Substitutionen, Teilzeichenfolge, trimmen, rtrim etc.

alle nicht-alphanumerischen Zeichen zu beseitigen, tun

CLEANSTRING=${STRING//[^a-zA-Z0-9]/}

Das ist Ockhams Rasiermesser. Keine Notwendigkeit, einen anderen Prozess zu starten.

Schnell und schmutzig:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

Sie können es durch Perl laufen.

export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

Ich bin mit KSH-Stil Subshell hier, ich bin nicht ganz sicher, dass es in der Bash funktioniert.

Das ist das Schöne an der Schale, ist, dass Sie Perl verwenden können, awk, sed, grep ....

Nach einem wenig umsah scheint es tr ist in der Tat die einfachste Art und Weise:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-'  | tr '[:upper:]' '[:lower:]'`"

Ockhams Rasiermesser , nehme ich an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top