sed 정규식 16진수 문자

sed 정규식 16진수 문자

다음 문자열이 있습니다

echo -e "a12\x8fb12\x9f" | xxd
0000000: 6131 328f 6231 329f 0a                   a12.b12..

12\x9f시퀀스 sum 을 제거하고 싶습니다 12\x8f.sed

이 명령으로 할 수 있어요

sed -e 's_12\x8f__g' -e 's_12\x9f__g'

그런데 왜 이 명령이 작동하지 않는 걸까요?

sed -e 's_12[\x8f\x9f]__g'

답변1

[...]역할이 일치하기 때문이죠 . sed에 지정된 범위를 기준으로 문자 일치를 시도합니다 [...]. UTF-8 로케일에서는 \x8f멀티바이트 문자의 일부인 문자만 만날 수 있습니다. 둘 중 하나도 일치하지 않는다는 것을 알 수 있습니다 .(이것은 POSIX 요구 사항입니다).

예를 들어:

sed 's/[eé\xa9]//'

무의미한. é은 문자( 로 인코딩됨 0xc3 0xa9)이고, 0xa9는 문자가 아니지만 문자(예: é) 내부에서 찾을 수 있는 바이트는 e문자(0x65로 인코딩됨)입니다. sed문자 및 바이트 내에서 0xa9를 어떻게든 일치시킬 수 있다고 기대할 수는 없습니다 .

모든 바이트 데이터를 다음과 연결합니다.텍스트이와 같은 유틸리티의 경우 sed문자가 바이트인 로케일을 사용해야 합니다. 이는 일반적인 경우입니다.LC_ALL=C.

LC_ALL=C sed 's/12[\x8f\x9f]//g'

또는 휴대용:

LC_ALL=C sed "$(printf 's/12[\217\237]//g')"

이 경우에는 sed.를 사용할 수 없습니다 .perl -p/-n

관련 정보