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

Remove all special characters and case from string in bash

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

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

1
2
Some_randoM data1-A
More Data0

到:

1
2
somerandomdata1a
moredata0

我在许多不同的编程语言中看到了很多这样做的问题,但在bash中没有。有什么好办法吗?


1
2
3
cat yourfile.txt | tr -dc '[:alnum:]

'
| tr '[:upper:]' '[:lower:]'

第一trdeletes特殊字符。删除d均值,均值和c(反转的字符集)。所有的操作系统中,除了那些-dc删除指定的均值。在

保护Linux和Windows都包含一个换行符或风格,是你想要的。

第二个translates到lowercase uppercase字符。


解决方案:4 +纯巴什

1
2
3
4
5
6
$ filename='Some_randoM data1-A'
$ f=${filename//[^[:alnum:]]/}
$ echo"$f"
SomerandoMdata1A
$ echo"${f,,}"
somerandomdata1a

这个函数是:

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

尝试它。

1
2
$ clean"More Data0"
moredata0


我用tr消除没有任何字符的一部分,[:print:]

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

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

以及如何你可能想|(管)输出到od -c到确认的结果

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

如果你是用mkelement0丹和幸福的方法。你也可以寻找到POSIX正则表达式sed +。

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

所有其他字符的SED的比赛没有包含在除了字母和数字的东西和删除它们。