正则表达式查找并用下划线替换特殊字符

Regex find and replace special chars with underscore

我很抱歉,因为我知道这个问题已经被问过很多次了。但是,我找不到适合我的答案!似乎大多数答案似乎都是用特定的语言设计的,例如 Java 或 php。我试图在终端 (mac) 行以“纯”正则表达式格式进行这项工作。这段代码有效,但我想找到特殊字符并替换为下划线。就像现在一样,正则表达式什么都没有替换。知道如何指定替换值吗?

find . -type f|while read f;do b=${f##*/};mv "$f" "${f%/*}/${b//[^[:alnum:]_.]}";done 

您可以指定更换一个/:

"${f%/*}/${b//[^[:alnum:]_.]/_}"
#                           ↑↑

此处,${b//[^[:alnum:]_.]/_} 表示除字母、数字、下划线和点之外的任何单个字符将被替换为 _ 个字符。

如果您需要用单个下划线替换一个或多个特殊字符的块,请使用

shopt -s extglob
"${f%/*}/${b//+([^[:alnum:]_.])/_}"
shopt -u extglob