特殊文字をすべて削除してA-Za-z0-9だけを残したいです()[]
echo 'Some Movie Name! (2015) [1080p]' |sed -e 's/[^A-Za-z0-9.()[]]/./g'
私に次のような出力を与えます。
Some Movie Name! (2015) [1080p]
これが私が望むものです:
Some.Movie.Name.(2015).[1080p]
「]」「]」をエスケープする方法がわかりません。動作しません。
私が得ることができる最も近いものは次のとおりです。
echo 'Some Movie Name! (2015) [1080p]' |sed -e 's/[^A-Za-z0-9.()[]/./g'
Some.Movie.Name..(2015).[1080p.
その後、再度sedにパイプして二重ピリオドを削除できます。
|sed 's/\.\././g'
答え1
@Glenn Jackmanの敏感な観察に基づいて、方法は次のように変更されました。
$ printf '%s\n' "$string" | tr -cs '[:alnum:].[]()\n' '[.*]'
-c
=>入力セットを反転/補完します。-s
=>は、データで見つかった2の補数入力セットの連続文字を単一点文字に圧縮します。
tr
マルチバイト文字をサポートする実装はほとんどありませんsed
。特にGNUはtr
これをサポートしていませんが、GNUはsed
サポートしています。たとえば、UTF-8入力で英語以外の文字を処理するには、次のように切り替えることができますsed
。
printf '%s\n' "$string" | sed 's/[^][[:alnum:]()]\{1,\}/./g'
は]
すぐ後ろに来なければなりません^
。また、たとえば、ベースのソリューションの代わりに変更.
するためにサプリメントセットから削除しました。foo-.txt
foo.txt
foo..txt
tr
答え2
誤解を防ぐために、一致させたい終了文を不正文の]
直後に配置してください。正規表現の終わりに複数の文字をピリオドに置き換える^
ことができます(@Rakesh Sharmaに感謝します)。\+
$ echo 'Some Movie Name! (2015) [1080p]' | sed -e 's/[^][A-Za-z0-9()]\+/./g'
Some.Movie.Name.(2015).[1080p]
答え3
そしてzsh
:
$ set -o extendedglob
$ string='Some Movie Name! (2015) [1080p]'
$ printf '%s\n' ${string//[^][()[:alnum:]]##/.}
Some.Movie.Name.(2015).[1080p]
ksh93
または使用bash -O extglob
(shopt -s extglob
bashなしで呼び出し後に開始-O extglob
):
$ string='Some Movie Name! (2015) [1080p]'
$ printf '%s\n' "${string//+([^][()[:alnum:]])/.}"
Some.Movie.Name.(2015).[1080p]
zshx##
またはkshは、1つ以上のsと一致する+(x)
拡張正規表現に似ています。x+
x
答え4
あなたはこれを行うことができますtr
:
x='Some Movie Name! (2015) [1080p]'
printf '%s\n' "$x" | tr -cd 'A-Za-z0-9.()[] ' | tr ' ' '.'
Some.Movie.Name.(2015).[1080p]