쉘 변수에서 하위 문자열 제거

쉘 변수에서 하위 문자열 제거

여기에 다음과 같은 문자열이 있습니다.

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

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

관련 정보