特殊文字をすべて削除して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