
다음 문자열이 있습니다
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
그럴 경우에는 대신 사용하세요 .