gpt4 book ai didi

linux - 我如何将 sed 与 unicode 字符一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 09:10:03 24 4
gpt4 key购买 nike

function change() {
for i in {0..28}
do
echo ",${cryp_data_letter[$i]}" "${org_data[$i]}"
sed -i "s/,${cryp_data_letter[$i]}/${org_data[$i]}/g" "./temp.txt"
#cat "./temp.txt"
done
}

我有一个函数可以根据特定规则更改 temp.txt 中的某些字符,但某些字符如 ı、ğ、ö 等会更改为空字符串。我想问题的原因是 UTF-8 那么我怎样才能将 sed 与 unicode 一起应用呢?或任何其他建议 --> "sed -i "s/,${cryp_data_letter[$i]}/${org_data[$i]}/g""./temp.txt""

这是给定的文件 temp.txt:

abc ğhıi
def
jkl
oöpr
uü vy z
çgm ns
şt

和输出:

IDK ,ğS,ıT
NMY
BOÜ
G,öHÇ
P,ü ÖF ,
,çUŞ ZĞ
,şV

顺便说一句,在返回过程中,我会将所有字母更改为小写,并在所有字母之前加上“,”,这样它就会变成在 sed 之前:

,a,b,c ,ğ,h,ı,i
,d,e,f
,j,k,l
,o,ö,p,r
,u,ü ,v,y ,z
,ç,g,m ,n,s
,ş,t

语言环境:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=tr_TR.UTF-8
LC_TIME=tr_TR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=tr_TR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=tr_TR.UTF-8
LC_NAME=tr_TR.UTF-8
LC_ADDRESS=tr_TR.UTF-8
LC_TELEPHONE=tr_TR.UTF-8
LC_MEASUREMENT=tr_TR.UTF-8
LC_IDENTIFICATION=tr_TR.UTF-8
LC_ALL=

最佳答案

这里有多个问题,每个问题都可能单独或组合导致您的问题。

  • 我们不知道您使用的是哪种字符集和编码。您的语言环境已针对 UTF-8 正确设置,但您的终端和其他软件可能无法正确互操作。或许还可以参见 Stack Overflow character-encoding tag info page一些背景和诊断。
  • 即使您的系统和实用程序通常与 UTF-8 兼容,也不能保证您的 sed 是。许多 sed 变体仍然没有注意到 Unicode,并且没有关于行为应该是什么的稳定建议。有时切换到另一种语言是有意义的;许多琐碎的 sed 脚本可以很容易地移植到 perl -CSD -p 下运行,只需很少或无需更改。
  • 即使其他一切都正常工作,Unicode 也提供了多种方式来表示许多重音字符。如果您的数据包含 ö 作为单个代码点 U+00E6 但您的脚本包含相应的分解序列,反之亦然,您的 sed 脚本(可能)不会替换替代表示。寻找 Unicode 规范化。

除此之外,如果第二点就足够了,那么下面的方法可能确实有效。

perl -CSD -pi~ e 'tr/AEİR...FJ/ABCÇ...YZ/' ./temp.txt

注意 -i~ 选项进行就地编辑但保存备份文件。我不太相信这会在没有一些修改和您方面可能的澄清的情况下立即起作用。

关于linux - 我如何将 sed 与 unicode 字符一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58240573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com