我这里有一些读起来像这样的字符串
Dio - We Rock-Greatest Hits (2CD) (2004)
我用这个
NewDirectoryName=${NewDirectoryName%'(" ")'* }
NewDirectoryName=${NewDirectoryName//[^A-Za-z ]/ }
它给了我剩下的:
NewDirectoryName is -> Dio We Rock Greatest Hits Cd
它删除了(2CD)
和 ,(2004)
只剩下Cd
.
让我困惑的是,如果它删除了(2004)
,那为什么它会(2CD)
变成Cd
.为什么只删除(2
and)
以及为什么它会D
变成d
?
我如何摆脱整个事情来得到这个:
Dio We Rock Greatest Hits
答案1
正如我所评论的,您的第一个扩展没有任何作用。文字字符串(" ")
不在字符串中,因此不会删除任何内容。然后第二次扩展删除所有不是字母或空格的字符。这就是“CD”保留下来的原因。您的代码中没有任何内容可以小写“CD”中的“d”。
如果要删除括号中的所有位:
shopt -s extglob
NewDirectoryName='Dio - We Rock-Greatest Hits (2CD) (2004)'
NewDirectoryName=${NewDirectoryName//\(*([^\)])\)}
# ...................................aa........cc
# .....................................bbbbbbbb
# (a) a literal open parenthesis
# (b) zero or more non-close-parenthesis characters
# (c) a literal close parenthesis
echo ">$NewDirectoryName<"
>Dio - We Rock-Greatest Hits <
要删除尾随空格:
NewDirectoryName=${NewDirectoryName%%+([[:blank:]])}
这使用“扩展模式匹配”模式,记录在本手册本节末尾:https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching