Bash는 교체와 하위 문자열 추출을 한 단계로 결합합니다.

Bash는 교체와 하위 문자열 추출을 한 단계로 결합합니다.

이 형식의 문자열의 경우:

./my-site.sub.domain.com

., -및 를 제거 /하고 나머지 부분을 16자로 자르고 싶습니다 .mysitesubdomainc

나는 이미 이것을 했다

mysite="./my-site.sub.domain.com"
mysite=${mysite//[\.|\/|-]//}
mysite=${mysite:0:16}
echo $mysite
mysitesubdomainc

대체와 부분 문자열 추출을 결합하는 방법이 있습니까?

답변1

Bash 내장을 연결할 방법이 없습니다매개변수 확장, 그러나 물론 이 작업은 외부 도구를 사용하여 한 줄로 수행할 수 있습니다 sed. 예를 들면 다음과 같습니다.

$ sed 's/[\.\/-]//g;s/^\(.\{16\}\).*/\1/' <<< "./my-site.sub.domain.com"
mysitesubdomainc

불행하게도 이는 유지 관리할 수 없는 코드가 되고 Bash 내부를 사용하는 것보다 효율성이 떨어질 수 있으므로 사용하지 않는 것이 좋습니다.

답변2

zsh를 사용하지 않는 이유는 무엇입니까?

$ echo ${${mysite//[\.\/-]/}:0:16}
mysitesubdomainc

(코드를 약간 수정했습니다)

답변3

@l0b0이 말했듯이 이 작업은 셸에서 한 단계로 수행할 수 없다고 생각하지만 외부 도구를 사용하면 충분히 간단합니다(문자열이 변수에 보관되어 있다고 가정 $s).

$ perl -pe 's#[.\-/]##g' <<<$s | grep -oP .{16}
mysitesubdomainc

관련 정보