从bash中的string中删除所有特殊字符和大小写

我正在写一个需要parsing文件名的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样式的换行符,我假设你想要的。

第二个将大写字符转换为小写字母。

纯粹的bash解决方案:

 $ 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