Bash 문자열은 여러 문자를 하나의 문자로 바꿉니다.

Bash 문자열은 여러 문자를 하나의 문자로 바꿉니다.

결과를 모든 파일 시스템의 안전한 파일 이름으로 사용하기 위해 피드 제목에서 문자와 숫자를 제외한 모든 문자를 대시로 바꿨습니다.

$ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar"
$ echo ${t//[^A-Za-z0-9]/-}
Episodie-06--No-hope-of-riding-home--NEW----Advanced-grammar

그러나 반복되는 모든 대시를 하나의 대시로 압축하고 싶습니다.Episodie-06-No-hope-of-riding-home-NEW-Advanced-grammar

나는 두 가지 대체 패스를 사용하여 이를 달성할 수 있다는 것을 발견했습니다.

$ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar"
$ tmp=${t//[^A-Za-z0-9]/-}
$ echo ${tmp//--/-}
Episodie-06-No-hope-of-riding-home-NEW--Advanced-grammar

다음과 같이 한 번에 할 수 있다고 생각합니다.

$ echo ${t//[^A-Za-z0-9]+/-}

하지만 작동하지 않습니다.

어떤 단서가 있나요?

sed참고: 다른 도구를 사용하고 싶지 않습니다.

답변1

기존의 쉘 와일드카드보다 더 강력한 것이 필요합니다. Bash에서 extglob정규식에 대한 액세스를 제공하는 이 옵션을 설정하십시오.글로벌 모드ksh에서 상속된 특이한 구문을 통해.

shopt -s extglob
sanitized=${raw//+([^A-Za-z0-9])/-}

답변2

tr일을 위한 좋은 도구이다

new=$( printf "%s" "$t" | tr -cs 'a-zA-Z0-9' '-' )
new=${new#-}; new=${new%-}

답변3

순수 bash를 계속 사용하려면 2단계 솔루션을 사용해야 합니다. Bash 문자열 교체 사용구체, 경로 이름 확장에 표시된 대로아니요자주 사용되는 표현. glob의 유일한 특수 문자는 *, ?및 이며 [], 정규식에서 대략적으로 해당하는 문자는 .*, .및 입니다 []. 보세요울위치 위키피디아bash(1)자세한 내용은 매뉴얼 페이지 섹션을 참조하세요 .Parameter ExpansionPathname Expansion

설명했듯이 순수 bash의 2단계 확장은 외부 프로그램을 호출하여 동일한 작업을 수행하는 것보다 여전히 빠르므로 크게 걱정하지 않아도 됩니다.

관련 정보