Domanda

Sto cercando il modo migliore per ricevere un semplice input:

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

e ripulirlo rimuovendo i caratteri non alfanumerici, le lettere minuscole e sostituendo gli spazi con i caratteri di sottolineatura.

L'ordine conta?È tr il modo migliore/unico per farlo?

È stato utile?

Soluzione

Come sottolinea dj_segfault, la shell può fare la maggior parte di questo per te.Sembra che dovrai ricorrere a qualcosa di esterno per scrivere in minuscolo la stringa.Per questo hai molte opzioni, come le battute perl sopra, ecc., Ma penso che tr sia probabilmente la più semplice.

# 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`

L'ordine qui è piuttosto importante.Vogliamo eliminare i caratteri di sottolineatura e sostituire gli spazi con caratteri di sottolineatura, quindi dobbiamo prima assicurarci di eliminare i caratteri di sottolineatura.Aspettando di passare le cose a tr fino alla fine, sappiamo di avere solo caratteri alfanumerici e caratteri di sottolineatura, e possiamo essere sicuri di non avere spazi, quindi non dobbiamo preoccuparci che i caratteri speciali vengano interpretati dalla shell.

Altri suggerimenti

Bash può fare tutto da solo, grazie mille.Se guardi la sezione della pagina man su Espansione dei parametri, vedrai che bash ha sostituzioni integrate, sottostringa, trim, rtrim, ecc.

Per eliminare tutti i caratteri non alfanumerici, esegui

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

Quello è Rasoio di Occam.Non è necessario avviare un altro processo.

Veloce e sporco:

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

Potresti eseguirlo tramite Perl.

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

Sto usando la subshell in stile ksh qui, non sono del tutto sicuro che funzioni in bash.

La cosa bella della shell è che puoi usare perl, awk, sed, grep....

Dopo un po' di guardarsi intorno sembra tr è davvero il modo più semplice:

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

rasoio di Occam, Credo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top