2017-06-28 12 views
2

私は安全で素敵なファイル名を生成するために、私がbashで消毒する必要のある自由形式の文字列を持っています。bashで文字列をサニタイズする方法は?

  • 小文字の文字
  • は(スペースを含む)dashとのすべてのサポートされていないか、安全でない文字を置き換える
  • :消毒結果」

    "some-unsafe-name-2-2" 
    

    ロジック期待

    STAGE_NAME="Some usafe name 2/2#" 
    

    例 の

  • 削除重複ダッシュ
  • 任意のプレフィックスからダッシュや接尾

sedのような外部ツールの使用は限り彼らはポータブルで(BSD/OSX /上全く利用できないオプションを使用していない許可されているを削除... )。

+0

'STAGE_NAME ='を削除したいですか? – Cyrus

+0

最初に考えた(テストされていない): 'STAGE_NAME = $(エコー$ STAGE_NAME | tr '[:upper:]' [:lower:] '| sed -e'/[^ $ SAFE_CHARS]/-/g '-e $ SAFE_CHARSは安全な文字の定義を含む文字列です(そうでなければ '\ 0'と '/'を除くすべての文字が許可されます、AFAIK)。 「接頭辞」と「接尾辞」にはどのような形式がありますか? – 0x5453

+0

* grumble *(re:任意のデータを安全に処理できないコードを修正しようとするのではなく、データを修正しようとしています)。 (でも気にしないで、私は風車で傾いている)。 –

答えて

4

あなたはこのサニタイズのために、この純粋なbashの機能を使用することができます。awkワンライナーがやっているここだけで学術的な運動のために

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

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

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 
} 

次にとしてそれを呼び出します同じ:

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

それはきちんとしています:)。 –

関連する問題