sed 정규식 HEX 문자

sed 정규식 HEX 문자

다음 문자열이 있습니다

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

시퀀스를 삭제 12\x9f하고 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')"

NUL 문자가 포함된 데이터(또는 개행 문자로 끝나지 않거나 개행 문자가 몇 킬로바이트 이상인 데이터)를 sed. perl -p/-n그럴 경우에는 대신 사용하세요 .

관련 정보