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

答え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 extglobshopt -s extglobbashなしで呼び出し後に開始-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]

関連情報