簡體   English   中英

我如何將 sed 與 unicode 字符一起使用

[英]How can i use sed with unicode character

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
}

我有一個 function 通過特定規則更改 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

和 output:

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=

很抱歉沒有回答,但我無法重現您的問題。

這是您在一個完全獨立的腳本中的代碼(請下次自行執行):

#!/bin/bash

if [[ ö != $'\xC3\xB6' ]]
then
  echo "You didn't save this file as UTF-8"
  exit 1
fi

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
}

# Shift all characters one letter ahead in the alphabet
cryp_data_letter=({a..z} ğ ö ı)
org_data=({b..z} ğ ö ı a)

# Create the file as you say it is before the sed
cat > temp.txt << "EOF"
,a,b,c ,ğ,h,ı,i
,d,e,f
,j,k,l
,o,ö,p,r
,u,ü ,v,y ,z
,ç,g,m ,n,s
,ş,t
EOF

change

cat temp.txt

當我運行./testscript我得到這個 output:

bcd öiaj
efg
klm
pıqs
v,ü wz ğ
,çhn ot
,şu

如您所見,包括öğ在內的字母被替換並插入得很好。

這里有多個問題,每個問題都可能單獨或組合導致您的問題。

  • 我們無法知道您使用的字符集和編碼。 您的語言環境已為 UTF-8 正確設置,但您的終端和其他軟件可能無法正確互操作。 或許還可以查看Stack Overflow character-encoding標簽信息頁面了解一些背景和診斷信息。
  • 即使您的系統和實用程序通常與 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~選項進行就地編輯但保存備份文件。 我幾乎沒有信心這會在沒有一些修改的情況下立即生效,並且可能會得到您的澄清。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM