为什么 sed 的点与 latin1 编码中的 ù 不匹配?

Why sed's dot doesn't match ù in latin1 encoding?

提问人:Enlico 提问时间:1/9/2023 更新时间:1/16/2023 访问量:73

问:

我有两个包含文本的文件,但一个是用 UTF-8 编码的,另一个是用 latin1 编码的,所以它们的内容是这样的aùbcritic_utf8critic_latin1

$ od -a critic_utf8 
0000000   a   C   9   b  nl
0000005
$ od -a critic_latin1 
0000000   a   y   b  nl
0000004

现在,撇开我不知道第二个输出中的那个(对应于 )是什么(我想了解,所以一个子问题是:那是什么?),在我看来,Sed 不匹配它:yùy.

$ sed 's/.*/x/' critic_latin1 
xùb
$ sed 's/.*/x/' critic_utf8 
x
$ sed 's/./x/g' critic_latin1 
xùx
$ sed 's/./x/g' critic_utf8 
xxx

这是什么意思?那个 Sed 不能处理 latin1 编码的文本文件?尽管如此,我认为除了换行符之外的所有内容都会匹配,但在这里它也不匹配其他内容。我知道这并没有像以前那样做出反应,正如以下证明的那样:.ù.\n

$ sed -z 's/.*/x/' critic_latin1 
xùb

我在尝试尝试我在这个答案中发现的内容时,在玩弄和文件(那些带有单词和同义词的文件)时注意到了这一点。*.idx*.dat

正则表达式 SED 编码 UTF-8 ISO-8859-1

评论

0赞 Wiktor Stribiżew 1/9/2023
很可能是因为它需要 2 个字节。
0赞 Enlico 1/9/2023
@WiktorStribiżew,但为什么不消耗所有这些字节呢?我想我只是不明白这两种情况下有什么匹配,恐怕。..

答:

1赞 Arnaud Valmary 1/9/2023 #1

两个步骤:

  1. sed命令读取包含格式为 language_COUNTRY 的变量内容的文件。字符集LANG
  2. 命令输出由终端按照自己的配置进行解释sed

我使用配置了字符集的变量和配置了 ISO-8859-1 (latin1) 编码的终端重现了您的输出:LANGUTF-8

> export LANG=fr_FR.UTF-8; echo "latin1"; sed 's/.*/x/' critic_latin1 ; echo "utf-8"; sed 's/.*/x/' critic_utf8; echo "latin1/g"; sed 's/./x/g' critic_latin1; echo "utf-8/g"; sed 's/./x/g' critic_utf8
latin1
xùb
utf-8
x
latin1/g
xùx
utf-8/g
xxx

一个带有 UTF-8 的值,据说可以处理 UTF-8 字符,但在 ur 中,您有一个以 ISO-8859-1 编码的字符(只有一个字节)。此字符在 UTF-8 中无效。所以不处理未知(无效)字符。LANGsedcritic_latin1ùsed

如果要处理与变量编码不同的文件,请像这样使用前缀:LANGLANG=...

> export LANG=fr_FR.ISO-8859-1; echo "latin1"; sed 's/.*/x/' critic_latin1 ; echo "utf-8"; sed 's/.*/x/' critic_utf8; echo "latin1/g"; sed 's/./x/g' critic_latin1; echo "utf-8/g"; sed 's/./x/g' critic_utf8
latin1
x
utf-8
x
latin1/g
xxx
utf-8/g
xxxx

它对于数据文本文件(如 ISAM)非常有用。

评论

0赞 AmigoJack 1/15/2023
你说的“不特质”是指“不治疗”吗?