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

时间:2014-05-22 20:15:37

标签: regex linux bash shell parsing

我正在编写一个需要解析文件名的bash脚本。

需要删除所有特殊字符(包括空格):"!?。 - _ 并将所有大写字母更改为小写。像这样:

Some_randoM data1-A
More Data0

为:

somerandomdata1a
moredata0

我在许多不同的编程语言中看到了许多问题,但在bash中没有。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:32)

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

第一个tr删除特殊字符。 d表示删除,c表示补码(反转字符集)。因此,-dc表示删除除指定字符之外的所有字符。包含\n\r是为了保留linux或Windows风格的换行符,我认为这是你想要的。

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

答案 1 :(得分:11)

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

答案 2 :(得分:4)

如果您正在使用mkelement0和Dan Bliss方法。您还可以查看sed + POSIX正则表达式。

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

Sed匹配括号内未包含的所有其他字符(字母和数字除外)并删除它们。

答案 3 :(得分:4)

我已使用tr删除任何不属于[:print:]类的字符

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

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

此外,您可能希望|(管道)输出到od -c以确认结果

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