Réponses:
Il suffit d'utiliser cette syntaxe:
sed 's/馑//g' file1
Ou sous la forme échappée:
sed "s/$(echo -ne '\u9991')//g" file1
(Notez que les anciennes versions de Bash et de certains shells ne comprennent pas echo -e '\u9991'
, alors commencez par vérifier.)
sed
le modificateur g, il remplace toutes les occurrences également lorsqu'elles se succèdent. Aussi, sed devrait le compter comme un caractère, voir: echo -ne "馑" | wc -m
donne 1
. Si vous comptez le nombre d'octets ( wc -c
), il retournera 3
. Ai-je bien compris votre question?
.
signifie "un caractère" ou "un octet"?
echo 馑 | sed s/...//
me donne donc 馑
(rien n'est remplacé)
en_US.UTF-8
, mais pas sous C
.
Perl peut le faire:
echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'
-CS
active UTF-8 pour les entrées, sorties et erreurs standard.
Un certain nombre de versions du sed
support Unicode :
Je ne pouvais pas trouver d'informations sur BSD sed, ce qui me paraissait étrange, mais je pense que les chances sont bonnes qu'il prenne également en charge Unicode. Malheureusement, il n'existe pas de méthode standard permettant de déterminer le sed
codage à utiliser. Chacun le fait à sa manière.
Cela fonctionne pour moi:
$ vim -nEs +'%s/\%u9991//g' +wq file1
C'est une goutte plus verbeuse que je ne l'aimerais; voici une explication complète:
-n
désactiver le fichier d'échange vim-E
Mode amélioré Ex-s
mode silencieux+'%s/\%u9991//g'
exécuter la commande de substitution+wq
sauvegarder et quitterfile1
en place , est-ce correct?
Avec les versions récentes de BASH, omettez simplement les guillemets autour de l'expression sed et vous pouvez utiliser les chaînes échappées de BASH. Les espaces dans l'expression sed ou des parties de l'expression sed qui pourraient être interprétées par BASH comme des caractères génériques peuvent être individuellement cités.
$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻
echo 馑 | sed s/...//
n'imprime rien?