从bash中的字符串中删除所有特殊字符和大小写
Posted
技术标签:
【中文标题】从bash中的字符串中删除所有特殊字符和大小写【英文标题】:Remove all special characters and case from string in bash 【发布时间】:2014-07-12 01:09:14 【问题描述】:我正在编写一个需要解析文件名的 bash 脚本。
它需要删除所有特殊字符(包括空格):"!?.-_ 并将所有大写字母更改为小写。像这样:
Some_randoM data1-A
More Data0
到:
somerandomdata1a
moredata0
我在许多不同的编程语言中看到了很多问题,但在 bash 中却没有。有什么好办法吗?
【问题讨论】:
此处的小写示例:***.com/questions/2264428/… 此处删除空格:***.com/questions/369758/… 更一般地说,Bash 正则表达式:tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF 【参考方案1】:cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]'
第一个tr
删除特殊字符。 d
表示删除,c
表示补码(反转字符集)。因此,-dc
表示删除除指定字符之外的所有字符。包含 \n
和 \r
是为了保留 linux 或 windows 样式的换行符,我假设你想要。
第二个将大写字符转换为小写。
【讨论】:
如果您(就像我一样)来到这里寻找解决方案,那么摆脱变量 var2=echo $var | tr -d '[:cntrl:]'
中的 \r \n 或 ^C 等字符就是解决方案。感谢这个答案,我想通了。【参考方案2】:
纯 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
【讨论】:
+1;,,
运算符(将整个字符串转换为小写)需要bash 4+
。【参考方案3】:
如果您使用 mkelement0 和 Dan Bliss 方法。您还可以查看 sed + POSIX 正则表达式。
cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g'
Sed 匹配除字母和数字之外的所有其他未包含在括号内的字符并将其删除。
【讨论】:
不错的答案!你救了我的命!【参考方案4】:我使用tr
删除了不属于[:print:]
类的所有字符
cat file.txt | tr -dc '[:print:]'
或
echo "..." | tr -dc '[:print:]'
此外,您可能希望将|
(管道)输出到od -c
以确认结果
cat file.txt | tr -dc '[:print:]' | od -c
【讨论】:
od
对我有用以上是关于从bash中的字符串中删除所有特殊字符和大小写的主要内容,如果未能解决你的问题,请参考以下文章
如何对bash中的所有字符(特殊和非特殊)进行url编码[重复]