2017-06-28 5 views
2

Ich habe eine Freiform-Zeichenkette, die ich in bash sanieren muss, um sichere und nette Dateinamen zu erzeugen.Wie man eine Schnur in der Bash saniert?

Beispiel:

STAGE_NAME="Some usafe name 2/2#" 

Erwartete hygienisiert Ergebnis“

"some-unsafe-name-2-2" 

Logic:

  • Klein Zeichen
  • ersetzen alle nicht unterstützten oder unsichere Zeichen mit dash (inklusive Leerzeichen)
  • entfernen dupliziert Striche
  • keine Striche aus Präfix oder Suffix

Einsatz externer Tools entfernen wie sed, so lange darf sie tragbar sind (nicht Optionen, die nicht auf BSD verfügbar sind/OSX/...).

+0

Tun Sie auch Möchte "STAGE_NAME ='? – Cyrus

+0

Erster Gedanke (ungetestet): 'STAGE_NAME = $ (echo $ STAGE_NAME | tr '[: oberer:]' '[: niedriger:]' | sed -e 's/[^ $ SAFE_CHARS]/-/g' -e '/ -/-/g') 'wobei' $ SAFE_CHARS' eine Zeichenkette ist, die Ihre Definition von sicheren Zeichen enthält (ansonsten sind alle Zeichen außer '\ 0' und '/' erlaubt, AFAIK). Welches Format erwarten Sie für 'Präfix' und 'Suffix'? – 0x5453

+0

* murren * (re: versuchen, die Daten zu reparieren, anstatt zu versuchen, den Code zu reparieren, der nicht mit beliebigen Daten sicher umgehen kann). (Aber nichts gegen mich, ich kippe bei Windmühlen). –

Antwort

4

Sie können diese reine bash-Funktion für dieses sanitization verwenden:

sanitize() { 
    local s="${1?need a string}" # receive input in first argument 
    s="${s//[^[:alnum:]]/-}"  # replace all non-alnum characters to - 
    s="${s//+(-)/-}"    # convert multiple - to single - 
    s="${s/#-}"     # remove - from start 
    s="${s/%-}"     # remove - from end 
    echo "${s,,}"    # convert to lowercase 
} 

Dann ist es so nennen:

sanitize "///Some usafe  name 2/2##" 
some-usafe-name-2-2 

sanitize "Some usafe name 2/2#" 
some-usafe-name-2-2 

Gerade für eine akademische Übung ist hier ein awk Einzeiler tun das gleiche:

awk -F '[^[:alnum:]]+' -v OFS=- '{$0=tolower($0); $1=$1; gsub(/^-|-$/, "")} 1' 
+1

Das ist nett :). –

Verwandte Themen