sedを使用してスペースをピリオドに置き換えて()と[]を保持する方法

sedを使用してスペースをピリオドに置き換えて()と[]を保持する方法

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

おすすめ記事