J'ai besoin de rechercher et de remplacer toutes les occurrences d'un caractère inconnu dans certains fichiers portant le même nom.
En ouvrant de tels fichiers avec vi, j'ai lu le code <91> pour ce personnage. En les ouvrant avec du nano, j'ai lu un "point d'interrogation" dans un diamant (rhumble noir).
Je voudrais remplacer ce caractère inconnu par une citation ('). J'essaie de nombreuses façons sans chance.
J'ai essayé:
find ./ -name filename.txt -exec perl -i~ -pe "s/\x91/'/" {} \;
find ./ -name filename.txt -exec sed -i "s/\x91/'/g" {} \;
EDITER Plus d'informations sur le personnage:
Hexadecimal: 91 68 74 74
Decimal: 145 104 116 116
Octal: 221 150 164 164
Binary: 10010001 01101000 01110100 01110100
LC_ALL=C sed -n l < file
\221
Si vous avez besoin de plus, demandez!
sed -i "s/\x91/'/g"
celafile
ne fonctionne-t-il pas?Réponses:
Vous devriez jeter un œil à l'aide
hexdump -C
et trouver les octets autour. En supposant UTF-8, ce quivi
apparaît comme<91>
(décimal 145, un point unicode dénué de sens dans le texte) serait deux octets, 0xc2 et 0x91.Cela implique que vos substitutions n'ont pas fonctionné du tout, mais si vous avez simplement remplacé 0x91 par 0x27, vous aurez invalidé l'UTF-8 (le deuxième octet d'une séquence de deux octets a toujours le bit élevé défini, c'est-à-dire est > = 0x80). Cela pourrait compliquer votre analyse, mais
vi
devrait alors l'indiquer?'
.Cela dit, j'ai testé cela et cela fonctionne:
Si
$ARGV[0]
existe quand<>
est référencé, perl le supprime de la pile d'arguments et le prend comme chemin de fichier à utiliser pour la saisie (je trouve les scripts courts plus faciles à modifier et à travailler avec plus d'un liners, BTW). Cela s'accumule dans la mémoire (très bien tant que les fichiers ne sont pas massifs), tandis queperl -i
renommer le fichier d'origine pour éviter les conditions de concurrence de modification sur place (voirperldoc perlrun
).Vous pouvez donc utiliser cela:
la source
hexdump -C
pour voir ce qui s'y trouve réellement?Si c'est bien le caractère U + 0091 (0xc2 0x91 dans le codage UTF-8) et non l'octet 0x91, alors:
Le convertirait en
'
.Avec GNU
sed
:Éditer:
Cependant, dans votre cas, le fichier n'est pas en UTF-8. Les caractères UTF-8 sont d'un octet, uniquement pour les caractères ASCII (pour les valeurs 0 à 0x7F). Les autres caractères sont représentés par deux octets ou plus dont la valeur est supérieure à
0x7F
. Ainsi, un0x91
octet, sans octet supérieur à 0x7F autour, ne peut pas être trouvé dans un fichier utf-8.Plus probablement, votre fichier est dans un jeu de caractères à un octet, très probablement un Microsoft comme Windows-1252 .
Dans windows-1252, 0x91 est le caractère de guillemet simple gauche. L'équivalent unicode est U + 2018 qui est écrit en UTF-8
0xe2 0x80 0x98
.Si vous souhaitez convertir votre fichier en UTF-8, le mieux est probablement d'utiliser un outil dédié pour cela. Comme:
Ou:
Ou si vous voulez le faire pour tous
filename.txt
:la source
U+0091
. Veuillez ajouter la sortie deLC_ALL=C sed -n l < file
à la question.