Wie dj_segault zeigt, kann die Shell das meiste für Sie tun. Sieht so aus, als müsstest du auf etwas Äußeres zurückgreifen, um die Saite tiefer zu legen. Dafür hast du viele Optionen, wie die Perl-Einzeiler oben, etc., aber ich denke, dass tr wahrscheinlich die einfachste ist.
# 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 hier ist etwas wichtig. Wir wollen Unterstriche entfernen und Leerzeichen durch Unterstriche ersetzen, daher müssen wir zuerst die Unterstriche entfernen. Indem wir darauf warten, die Dinge bis zum Ende an tr weiterzugeben, wissen wir, dass wir nur alphanumerische und Unterstriche haben, und wir können sicher sein, dass wir keine Leerzeichen haben, so dass wir uns keine Gedanken darüber machen müssen, welche Sonderzeichen von der Shell interpretiert werden.
Hinweis für den Leser: Wenn Sie Probleme haben, dies zu tun, überprüfen Sie Ihren Shebang, um zu sehen, ob Sie bash oder sh aufrufen, und wie Ihr System 'sh' interpretiert. –
Ab Bash 4 kann es Fallmodifikation auch tun. 'Kleinbuchstaben = $ {CLEAN ,,}' [Bash Hackers Wiki] (http: //wiki.bash-hackers.org/syntax/pe) erklärt Parametererweiterungen auf eine * lesbarere * Weise als man-Seiten. – toxalot
Gute Arbeit. Ich kannte diese Shell-Features bisher nicht. Vielen Dank! Ich habe gerade entdeckt, dass zsh ermöglicht Ihnen tatsächlich * alle diese * Nest *, so dass Sie es in einer Zeile tun können: 'echo -n $ {$ {$ {str // _ /} ///_} // [^ a-zA-Z0-9 _] /} | tr A-Z a-z' ..nicht, dass ich empfehlen würde, etwas in einem Skript unverständlich zu machen. :) (bearbeiten: Formatierung) –