Bash 변수 대체 및 와일드카드가 작동한다고 생각합니다.특징해상도가 있어서 그걸 보고 깜짝 놀랐어요바이트등급.
나에 관한 모든 locale
것은 en_AU.UTF-8
일치하는 항목이 없고 패턴에서 0 대 다수를 허용하는 경우 다음에서 대체가 발생합니다.바이트후속 대체에 표시된 수준입니다. 다음으로 넘어갈 줄 알았는데특징, 하지만 그렇지 않습니다 ...
어쩌면 이것은 단지 이상한 경우의 패턴일 수도 있고 분명한 것을 놓치고 있는 것일 수도 있지만 여기서 무슨 일이 일어나고 있는지 궁금하고 이 특정 패턴 외에 다른 곳에서도 이 동작을 기대할 수 있습니까?
다음은 스크립트입니다(처음에는 문자열을 문자로 분할하려고 시도함).
나는 Character 에 대한 마지막 테스트가 ळ
다음과 같이 끝날 것이라고 예상했습니다.하나의앞에는 공백이 있지만 ळ
문자의 3 UTF-8 바이트 각각 앞에는 공백이 있습니다. 이로 인해 잘못된 UTF-8 출력이 발생합니다.
shopt -s extglob
for str in $'\t' "ab" ळ ;do
printf -- '%s' "${str//*($'\x01')/ }" |xxd
done
산출:
0000000: 2009 .
0000000: 2061 2062 a b
0000000: 20e0 20a4 20b3 . . .
답변1
귀하의 질문에 대한 짧은 대답은 *(pattern-list) 가 주어진 패턴의 0개 이상의 발생과 일치한다는 것입니다. 각 입력 바이트 사이에는 유니코드 문자 0001의 인스턴스가 없습니다. 따라서 교체 작업은 이러한 0 인스턴스 각각을 공백으로 바꿉니다.
어쩌면 당신은 이것을하고 싶을 수도 있습니다 :
$ for str in $'\t' "ab" ळ ; do
printf -- '%s' "${str//+($'\x01')/ }" |xxd
done)
0000000: 09 .
0000000: 6162 ab
0000000: e0a4 b3 ...
그러나 더 긴 대답은 어쨌든 경로 이름은 텍스트가 아니라는 것입니다. 적어도 (유닉스 계열) 운영 체제에 관한 한 충분하지 않습니다. 이는 일련의 바이트입니다. 문제는 다음과 같은 작업이 간단하다는 것입니다.
$ LC_ALL=latin1
$ mkdir 'áñ' && cd 'áñ'
$ LC_ALL=ga_IE.iso885915@euro
$ mkdir '€25' && cd '€25'
$ LC_ALL=zh_TW
$ pwd
# ... what should the output be? And what about the output of:
$ /bin/pwd
각 로캘에는 다른 로캘에 없는 문자가 포함되어 있습니다. 이 문제는 다음과 같은 사항에 영향을 미칩니다.위치-r그리고찾기 - 정규식또한 논쟁위치-r정규식이므로 문자 클래스와 같은 지원이 포함되어야 하지만 경로 이름에 있는 문자의 문자 클래스를 결정하는 데 어떤 로케일이 사용되는지 또는 사용할 수 있는 로케일이 있는지 알 수 없습니다. 모든 경로를 나타냅니다.