【发布时间】:2019-11-04 16:51:15
【问题描述】:
我想将任何特殊字符(不是数字或字母)替换为一个“-”。
我用一些字符尝试了下面的代码,但是当字符重复超过 1 次时它不起作用,因为仍然会有多个 '-'。
#!/bin/bash
for f in *; do mv "$f" "${f// /-}"; done
for f in *; do mv "$f" "${f//_/-}"; done
for f in *; do mv "$f" "${f//-/-}"; done
我想要什么:
test---file -> test-file
test file -> test-file
test______file -> test-file
teeesst--ffile -> teeesst-ffile
test555----file__ -> test555-file
请解释一下你的答案,因为我不太了解 bash、regexp...
【问题讨论】:
-
不需要循环。您只需要
tr -s [[:punct:]] '-',例如:echo "test______file" | tr -s [[:punct:]] '-'只需将其粘贴到命令行即可进行测试。 -
要处理末尾的标点符号,您可以使用 命令替换,例如
a=$(echo "test555----file__" | tr -s [[:punct:]] '-'); echo ${a%-}产生test555-file -
两个不同的文件名可以导致相同的文件名。注意不要覆盖任何文件。
-
我会选择对初学者更友好的东西
sed -e 's/\(\W\+\|\_\+\)\+/-/g' -e 's/-$//g'sed 用于流编辑。因此,您可以将文件名流传递给它。您似乎要求找到特殊字符(不是单词和_)的组,并将它们更改为一个-。意思是在正则表达式中你试图找到\W或_的分组然后你不希望任何文件以-结束所以再替换's/-$//g'然后你可以从这里编写一个小脚本来迭代你的文件,然后重命名它们。
标签: linux string bash replace opensuse