gpt4 book ai didi

linux - 如何替换Bash中N个重复的特殊字符?

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:45 24 4
gpt4 key购买 nike

我想将任何特殊字符(不是数字或字母)替换为一个“-”。

我用一些字符尝试了下面的代码,但是当字符重复超过 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、正则表达式不太了解......

最佳答案

在不同的 Linux 发行版中,有几个不同的 rename(或 prename)命令可以处理正则表达式替换。

但是您也可以使用 Bash 的扩展通配符来完成其中的一些操作。模式 ${var//+([-_ ])/-} 表示用一个连字符替换方括号中列出的一个或多个字符。

shopt -s extglob
# demonstration:
for file in test---file 'test file' test______file teeesst--ffile test555----file__
do
echo "${file//+([-_ ])/-}"
done

输出:

test-file
test-file
test-file
teeesst-ffile
test555-file-

扩展的 glob +() 类似于正则表达式中的 .+。其他 Bash 扩展 glob(来自 man bash):

          ?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns

请注意,此处未删除最后的连字符,但可以使用附加参数扩展:

file=${file/%-/}

表示删除字符串末尾的连字符。

关于linux - 如何替换Bash中N个重复的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56710170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com