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

Que*_*ark 23 regex linux bash shell parsing

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

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

Some_randoM data1-A
More Data0
Run Code Online (Sandbox Code Playgroud)

至:

somerandomdata1a
moredata0
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*iss 36

cat yourfile.txt | tr -dc '[:alnum:]\n\r' | tr '[:upper:]' '[:lower:]'
Run Code Online (Sandbox Code Playgroud)

第一个tr删除特殊字符.d表示删除,c表示补码(反转字符集).因此,-dc意味着删除除指定字符之外的所有字符 在\n\r包括保持Linux或Windows风格的换行符,我假设你想要的.

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

  • 就好像你(就像我一样)来到这里寻找解决方案,在变量var2 =`echo $ var |中删除像\ r \n或^ C这样的字符.tr -d'[:cntrl:]'`是解决方案.由于这个答案,我想出了这个. (7认同)

gni*_*urf 13

纯粹的bash解决方案:

$ filename='Some_randoM data1-A'
$ f=${filename//[^[:alnum:]]/}
$ echo "$f"
SomerandoMdata1A
$ echo "${f,,}"
somerandomdata1a
Run Code Online (Sandbox Code Playgroud)

这个功能:

clean() {
    local a=${1//[^[:alnum:]]/}
    echo "${a,,}"
}
Run Code Online (Sandbox Code Playgroud)

试试吧:

$ clean "More Data0"
moredata0
Run Code Online (Sandbox Code Playgroud)

  • +1; `,,`运算符(将整个字符串转换为小写)需要`bash 4 +`. (3认同)

Unw*_*ble 7

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

cat yourfile.txt | sed 's/[^a-zA-Z0-9]//g'
Run Code Online (Sandbox Code Playgroud)

Sed匹配括号内除字母和数字之外的所有其他字符,并将其删除。


luk*_*a5z 6

我曾经tr删除不属于[:print:]班级的任何字符

cat file.txt | tr -dc '[:print:]'
Run Code Online (Sandbox Code Playgroud)

要么

echo "..." | tr -dc '[:print:]'
Run Code Online (Sandbox Code Playgroud)

另外,您可能想要|(输出)输出od -c以确认结果

cat file.txt | tr -dc '[:print:]' | od -c
Run Code Online (Sandbox Code Playgroud)