2012-06-30 2 views
0

У меня есть документ с некоторыми специальными символами, такими как неразрывное пространство, неразрывная дефис и т. Д. Я хочу нормализовать этот документ и заменить эти специальные символы пробелом. Кроме того, поскольку содержание этого документа собрано из разных ресурсов, в нем есть разные формы «Yeh» (ی), и я хочу их нормализовать.Найти и заменить символы без пробелов в Bash

Можно ли найти и заменить символы Unicode в документе с помощью команды sed? Могу ли я использовать коды Unicode вместо поверхностной формы символа? например, могу ли я использовать x00a0 вместо неразрывного пространства в команде sed? Как?


Извините за неправильное объяснение. Мои документы закодированы в UTF8 и содержат неанглийские символы. например, у меня есть документ на арабском языке, документ на урду и один на персидском (фарси). теперь я хочу заменить некоторые символы в этих файлах другим символом. По нормализации я имею в виду, что я хочу заменить все формы «Йе» на одну форму. . (Как вы, возможно, в настоящее время, есть много форм такого характера, который используется на арабском языке, но для упрощения и некоторых вопросов обработки я хочу, чтобы объединить все эти формы

+0

Вы можете, используя GNU СЭД, но вам следует использовать '' ed' или ex' для изменения файлов. Кроме того, я не знаю, что вы подразумеваете под «нормализацией». – ormaaj

+0

см. Http://stackoverflow.com/questions/8562354/remove-unicode-characters-from-textfiles-sed-other-bash-shell-methods, это также можно сделать в perl –

ответ

0

Это может работать для вас (GNU СЭД):

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 
Смежные вопросы