シェル変数から部分文字列を削除する

シェル変数から部分文字列を削除する

ここには次のような文字列があります。

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なぜ)ですか?Dd

これを得るためにすべてをどのように削除しますか?

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

関連情報