从 shell 变量中删除子字符串

从 shell 变量中删除子字符串

我这里有一些读起来像这样的字符串

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.为什么只删除(2and)以及为什么它会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

相关内容