sed 's/./@/' <<<$'\xfc'
바이트 0xfc
가 유효한 UTF-8 문자가 아니기 때문에 증상을 나타내는 샘플 명령이 실패합니다 .
대조적으로 GNU는 sed
(Linux, macOS에서도 설치 가능)는 오류를보고하지 않고 유효하지 않은 바이트를 전달합니다.
실제 로케일에 대한 지원을 잃어 버리지 않으 려면 이전에 승인 된 답변을 사용하는 것이 옵션 (미국 시스템 인 경우 외국 문자를 다룰 필요가없는 경우에는 괜찮을 수 있습니다).
그러나 동일한 명령 이 단일 명령 에만 임시 로 적용될 수 있습니다 .
LC_ALL=C sed -i "" 's|"iphoneos-cross","llvm-gcc:-O3|"iphoneos-cross","clang:-Os|g' Configure
참고 : 어떤 중요한 것은입니다 효과 LC_CTYPE
의 설정 C
, 그래서 LC_CTYPE=C sed ...
것 일반적으로 경우에도 작동하지만 LC_ALL
(이외로 설정을 될 일 C
)은 개별 우선합니다 LC_*
같은 - 종류 변수를 LC_CTYPE
. 따라서 가장 강력한 방법은을 설정하는 것 LC_ALL
입니다.
다만, (유효) 설정 LC_CTYPE
에 C
문자열을 처리하는 각 바이트 인 경우 자신의 자로 ( 아니오 로 부호화 규칙에 기초한 해석이 수행된다) 는 관계없이 대 - 멀티 주문형 - UTF-8 인코딩 OS X는 기본적으로 이용하는 것을 여기서 외국 문자 에는 멀티 바이트 인코딩이 있습니다.
간단히 말해서 : 설정 LC_CTYPE
에C
원인 기본적인 영어 문자로 문자 (7 비트 ASCII 범위에있는 것)를 인식 할 수있는 쉘 및 유틸리티를, 그래서 외국 문자. 예를 들어 대문자 / 소문자 변환이 실패 하는 문자로 취급되지 않습니다.
다시 말하지만, 와 같은 멀티 바이트 인코딩 문자를 일치 시킬 필요가없고 é
단순히 이러한 문자 를 전달 하려는 경우에는 문제가 없습니다. .
이것이 불충분하거나 원래 오류 의 원인 (문제를 일으킨 입력 바이트 결정 포함) 을 이해하고 필요할 때 인코딩 변환 을 수행 하려면 아래를 읽으 십시오.
문제는 입력 파일의 인코딩이 쉘의 인코딩과 일치하지 않는다는 것입니다.
보다 구체적으로, 입력 파일에는 UTF-8에서 유효하지 않은 방식으로 인코딩 된 문자가 포함되어 있습니다 (@Klas Lindbäck가 주석에 언급 한 바와 같이). 이것이 sed
오류 메시지가에 의해 말하려고하는 것입니다 invalid byte sequence
.
입력 파일은 다음과 같은 단일 바이트 8 비트 인코딩을 사용합니다.ISO-8859-1
"서유럽"언어를 인코딩하는 데 자주 사용되는 사용합니다.
예:
악센트 문자의 à
유니 코드 코드 포인트 0xE0
(224) 는와 동일합니다 ISO-8859-1
. 그러나 UTF-8 인코딩 의 특성으로 인해이 단일 코드 포인트는 2 바이트 로 표시 0xC3 0xA0
되지만 UTF-8 에서는 단일 바이트 를 전달하려는 시도 0xE0
가 유효하지 않습니다 .
여기서 A의 문제점을 보여주는 캐릭터를 사용 voilà
로서 부호화 ISO-8859-1
와 à
같이 표시 한 (AN ANSI-C 인용 배시 문자열 (비아 바이트 $'...'
용도가 있음) \x{e0}
바이트를 작성하기가) :
주의 sed
명령은 단순히 통해 입력을 전달하는 어떤 조합 효과적으로 없지만, 우리가 오류를 자극해야합니다
# -> 'illegal byte sequence': byte 0xE0 is not a valid char.
sed 's/.*/&/' <<<$'voil\x{e0}'
단순히 문제 를 무시 하기 위해 위의 LCTYPE=C
접근 방식을 사용할 수 있습니다.
# No error, bytes are passed through ('á' will render as '?', though).
LC_CTYPE=C sed 's/.*/&/' <<<$'voil\x{e0}'
당신이 할 경우 결정하는 문제의 원인 입력의 일부 , 다음을 시도하십시오
# Convert bytes in the 8-bit range (high bit set) to hex. representation.
# -> 'voil\x{e0}'
iconv -f ASCII --byte-subst='\x{%02x}' <<<$'voil\x{e0}'
출력은 16 비트 형식으로 상위 비트 세트 (7 비트 ASCII 범위를 초과하는 바이트)를 갖는 모든 바이트를 표시합니다. (그러나 정확하게 인코딩 된 UTF-8 멀티 바이트 시퀀스도 포함합니다. UTF-8에서 유효하지 않은 UTF-8 바이트를 구체적으로 식별하려면보다 정교한 접근 방식이 필요합니다.)
요청시 인코딩 변환 수행 :
표준 유틸리티 iconv
를 사용하여 ( -t
) 및 / 또는 ( -f
) 인코딩 을 변환 할 수 있습니다 . iconv -l
지원되는 모든 것을 나열합니다.
예 :
변환 ISO-8859-1
(기반 셸에 적용되는 인코딩 LC_CTYPE
되며, UTF-8
위의 예제에 기본적으로 기반) :
# Converts to UTF-8; output renders correctly as 'voilà'
sed 's/.*/&/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"
이 변환을 통해 외래 문자를 올바르게 일치시킬 수 있습니다 .
# Correctly matches 'à' and replaces it with 'ü': -> 'voilü'
sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')"
ISO-8859-1
처리 후 입력 BACK을 변환하려면 결과를 다른 iconv
명령으로 파이프하면됩니다 .
sed 's/à/ü/' <<<"$(iconv -f ISO-8859-1 <<<$'voil\x{e0}')" | iconv -t ISO-8859-1