我正在编写一个需要解析文件名的bash脚本。
需要删除所有特殊字符(包括空格):"!?。 - _ 并将所有大写字母更改为小写。像这样:
Some_randoM data1-A
More Data0
为:
somerandomdata1a
moredata0
我在许多不同的编程语言中看到了许多问题,但在bash中没有。有没有办法做到这一点?
答案 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