2012-06-30 54 views
0

我有一些文件,其中包含一些特殊字符,例如非破壞性空間,非破壞性連字符等。我想規範化這個文檔並用空格替換這些特殊字符。此外,由於本文檔的內容是從不同的資源中收集的,因此我有不同形式的「Yeh」(ی),並且我想對它們進行規範化。查找和替換Bash中的非破壞性空格字符

是否可以使用sed命令在文檔中查找和替換Unicode字符?我可以使用Unicode代碼而不是角色的表面形式嗎?例如,我可以在sed命令中使用x00a0而不是非破壞空間嗎?怎麼樣?


抱歉,對不對。 我的文檔以UTF8編碼,幷包含非英文字符。例如我有阿拉伯文文件,烏爾都語文件和波斯語文件(波斯文)。現在我想用另一個字符替換這些文件中的一些字符。 通過規範化,我的意思是我想將所有形式的「Yeh」替換爲一種形式。 (正如你可能現在也有這個特點,它已在阿拉伯語中使用的許多形式,但爲了簡化和一些處理問題,我想統一所有這些形式

+0

你可以使用GNU sed的,但你應該考慮使用'ed'或'ex'修改文件。另外,我不知道「正常化」是什麼意思。 – ormaaj

+0

請參閱http://stackoverflow.com/questions/8562354/remove-unicode-characters-from-textfiles-sed-other-bash-shell-methods,這也可以在perl –

回答

0

這可能會爲你工作(GNU SED):

echo abcd | sed 'p;y/\x61\x62\x63/ABC/' 
abcd 
ABCd 
+0

親愛的波通,我用你的腳本,但它不適用於阿拉伯語,烏爾都語甚至波斯語。 – Hakim

1

要處理UTF-8的文件,你必須分析每個人物從開始到結束。如果你需要有效地做到這一點,你必須寫一個真正的程序而不是試圖腳本的解決方案。

如果您只是想編寫腳本,將它轉換爲UTF-16然後處理這些字符會更容易。

一個相當低效的方法是:

#!/bin/bash 
function px { 
local a="[email protected]" 
local i=0 
while [ $i -lt ${#a} ] 
    do 
    printf \\x${a:$i:2} 
    i=$(($i+2)) 
    done 
} 
(iconv -f UTF8 -t UTF16 | od -x | cut -b 9- | xargs -n 1) | 
if read utf16header 
then 
px $utf16header 
out='' 
while read line 
    do 
    if [ "$line" == "000a" ] 
    then 
    out=$out$line 
    px $out 
    out='' 
    else 
    # put your coversion logic here. 
    # e.g 
    # if [ "$line" == "0031" ] ; then 
    # line="0041" 
    # fi 
    out=$out$line 
    fi 
    done 
fi | iconv -f UTF16 -t UTF8