결과를 모든 파일 시스템의 안전한 파일 이름으로 사용하기 위해 피드 제목에서 문자와 숫자를 제외한 모든 문자를 대시로 바꿨습니다.
$ 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 Expansion
Pathname Expansion
설명했듯이 순수 bash의 2단계 확장은 외부 프로그램을 호출하여 동일한 작업을 수행하는 것보다 여전히 빠르므로 크게 걱정하지 않아도 됩니다.