ファイル名を解析する必要があるbashスクリプトを書いています。
すべての特殊文字(スペースを含む)を削除する必要があります:"!?.-_そしてすべての大文字を小文字に変更します。このようなもの:
Some_randoM data1-A
More Data0
に:
somerandomdata1a
moredata0
私は多くの異なるプログラミング言語でこれを行うための多くの質問を見てきましたが、bashではそうではありません。これを行う良い方法はありますか?
cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]'
最初のtr
は特殊文字を削除します。 d
は削除、c
は補数(文字セットの反転)を意味します。そう、 -dc
は、指定された文字を除くすべての文字を削除することを意味します。 \n
および\r
は、LinuxまたはWindowsスタイルの改行を保持するために含まれています。
2番目は、大文字を小文字に変換します。
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
mkelement0とDan Blissアプローチを使用している場合。 sed + POSIX正規表現を調べることもできます。
cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g'
Sedは、文字と数字を除き、括弧内に含まれていない他のすべての文字と一致し、それらを削除します。
tr
を使用して、[:print:]
クラスの一部ではない文字を削除しました
cat file.txt | tr -dc '[:print:]'
または
echo "..." | tr -dc '[:print:]'
さらに、結果を確認するために、|
(パイプ)をod -c
に出力することもできます。
cat file.txt | tr -dc '[:print:]' | od -c