Bash文字列は、複数の文字を1つの文字に置き換えます。

Bash文字列は、複数の文字を1つの文字に置き換えます。

結果をすべてのファイルシステムの安全なファイル名として使用するために、フィードタイトルの文字と数字を除くすべての文字をダッシュ​​に変更しました。

$ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar"
$ echo ${t//[^A-Za-z0-9]/-}
Episodie-06--No-hope-of-riding-home--NEW----Advanced-grammar

しかし、繰り返されるすべてのダッシュを1つのダッシュに圧縮したいと思います。Episodie-06-No-hope-of-riding-home-NEW-Advanced-grammar

私は2つの代替パスを使用してこれを達成できることを発見しました。

$ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar"
$ tmp=${t//[^A-Za-z0-9]/-}
$ echo ${tmp//--/-}
Episodie-06-No-hope-of-riding-home-NEW--Advanced-grammar

次のように一度にできると思います。

$ echo ${t//[^A-Za-z0-9]+/-}

しかし、うまくいきません。

どんな手がかりがありますか?

sed注:他のツールを使用したくありません。

答え1

既存のシェルワイルドカードよりも強力なものが必要です。 Bashからextglob正規表現へのアクセスを提供するこのオプションを設定します。グローバルモードkshから継承された珍しい構文を介して。

shopt -s extglob
sanitized=${raw//+([^A-Za-z0-9])/-}

答え2

tr仕事のための良いツールです

new=$( printf "%s" "$t" | tr -cs 'a-zA-Z0-9' '-' )
new=${new#-}; new=${new%-}

答え3

純粋なbashを引き続き使用するには、2段階のソリューションを使用する必要があります。 Bash 文字列置換の使用、パス名拡張に示されているようにいいえよく使われる表現。 glob の唯一の特殊文字は*?およびであり[]、正規表現でおおよその対応する文字は.*.およびです[]。見てウルウィッチ ウィキペディアbash(1)詳細については、マニュアルページのセクションを参照してください。Parameter ExpansionPathname Expansion

説明したように、純粋なbashの2段階の拡張は、外部プログラムを呼び出して同じことを実行するよりも速いので、心配する必要はありません。

関連情報