여기에 다음과 같은 문자열이 있습니다.
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
내가 언급했듯이 첫 번째 확장은 아무 작업도 수행하지 않습니다. 리터럴 문자열이 (" ")
문자열에 없으므로 아무것도 제거되지 않습니다. 그런 다음 두 번째 확장에서는 문자나 공백이 아닌 모든 문자를 제거합니다. 그래서 "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