ここには次のような文字列があります。
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
なぜ)
ですか?D
d
これを得るためにすべてをどのように削除しますか?
Dio We Rock Greatest Hits
答え1
私が言ったように、最初の拡張は何もしません。リテラル文字列が(" ")
文字列にないため、何も削除されません。次に、2番目の拡張では、文字やスペース以外のすべての文字を削除します。だから「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