다음 문자열이 있습니다
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