【问题标题】:Remove all special characters and case from string in bash从bash中的字符串中删除所有特殊字符和大小写
【发布时间】:2014-07-12 01:09:14
【问题描述】:

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

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

Some_randoM data1-A
More Data0

到:

somerandomdata1a
moredata0

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

【问题讨论】:

标签: regex linux bash shell parsing


【解决方案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 对我有用
猜你喜欢
  • 2016-08-23
  • 2014-02-22
  • 2012-05-04
  • 2012-12-16
  • 2011-05-01
  • 2013-03-12
  • 2016-09-16
  • 2011-04-11
相关资源
最近更新 更多