0

偶然发现了奇怪的 sed 行为,其中只有部分 HEX 序列被识别:

我正在尝试修复一个带有奇怪字符的字符串,并且在尝试十六进制替换时 sed 只找到前三个字符。

xxd输出带有问题字符的字符串:

6965 7261 f480 8488 6e6f 7761 6e61 2031 iera....nowana 1

我想f480 8488用可打印的字符替换这个序列,但 sed 只能识别前三个:

sed 's/\xf4\x80\x84/00/g' | xxd
6965 7261 3030 886e 6f77 616e 6120 3136  iera00.nowana 16

f480 84被正确替换为3030

然而

sed 's/\xf4\x80\x84\x88/00/g' | xxd
6965 7261 f480 8488 6e6f 7761 6e61 2031  iera....nowana 1

没找到f480 8488

如果我将 if 分成两个 sed 语句,sed 's/\xf4\x80/0/g' | sed 's/\x84\x88/0/g'一切正常

如果它正在寻找对,我会理解,但为什么只有三个而不是四个字符?

4

1 回答 1

0

关注@tripleee 评论并确认解决方案表单@the.Legend

设置LC_ALL=C是一个有效的修复。这是有据可查的here

它强制应用程序使用默认语言进行输出:

 $ LC_ALL=es_ES man 
 ¿Qué página de manual desea?

 $ LC_ALL=C man 
 What manual page do you want?
于 2019-05-26T12:20:28.147 回答