web-dev-qa-db-ja.com

bashの文字列からすべての特殊文字と大文字と小文字を削除します

ファイル名を解析する必要があるbashスクリプトを書いています。

すべての特殊文字(スペースを含む)を削除する必要があります:"!?.-_そしてすべての大文字を小文字に変更します。このようなもの:

Some_randoM data1-A
More Data0

に:

somerandomdata1a
moredata0

私は多くの異なるプログラミング言語でこれを行うための多くの質問を見てきましたが、bashではそうではありません。これを行う良い方法はありますか?

22
Questionmark
cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]'

最初のtrは特殊文字を削除します。 dは削除、cは補数(文字セットの反転)を意味します。そう、 -dcは、指定された文字を除くすべての文字を削除することを意味します。 \nおよび\rは、LinuxまたはWindowsスタイルの改行を保持するために含まれています。

2番目は、大文字を小文字に変換します。

34
Dan Bliss

Pure BASH 4+ソリューション:

$ filename='Some_randoM data1-A'
$ f=${filename//[^[:alnum:]]/}
$ echo "$f"
SomerandoMdata1A
$ echo "${f,,}"
somerandomdata1a

これのための機能:

clean() {
    local a=${1//[^[:alnum:]]/}
    echo "${a,,}"
}

それを試してみてください:

$ clean "More Data0"
moredata0
12
gniourf_gniourf

mkelement0とDan Blissアプローチを使用している場合。 sed + POSIX正規表現を調べることもできます。

cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g'

Sedは、文字と数字を除き、括弧内に含まれていない他のすべての文字と一致し、それらを削除します。

7
Unwastable

trを使用して、[:print:]クラスの一部ではない文字を削除しました

cat file.txt | tr -dc '[:print:]'

または

echo "..." | tr -dc '[:print:]'

さらに、結果を確認するために、|(パイプ)をod -cに出力することもできます。

cat file.txt | tr -dc '[:print:]' | od -c
6
luka5z