Mon entrée foo.txt
est la suivante:
Grull^Zn Hernand^Zz
où le ^ Z se résout au caractère de contrôle \x1a
(vérifié avec od -x
sur le fichier)
Lorsque je lance la commande Perl suivante:
perl -pe s/\x1a//g foo.txt
Grulln Hernandz
le résultat: Grulln Hernandz
comme prévu. Cependant quand je redirige ceci dans un fichier
perl -pe s/\x1a//g foo.txt > out.txt
Les fichiers sont identiques, démontrés par
diff -c out.txt foo.txt No differences encountered
Comment puis-je forcer ce comportement à fonctionner comme prévu?
Je ne pense pas
perl -pe s/\x1a//g foo.txt
fait ce que vous en pensez Dans tout shell Solaris sain, un \x
non cité est traité de la même manière que x
et vous exécutez la même chose que
perl -pe s/x1a//g foo.txt
Vous pouvez tester cela en exécutant
echo s/\x1a//g
et voir ce qui est passé à la coquille. Vous pouvez aussi essayer
perl -pe s/\x1a//g foo.txt | od -c
pour voir si les caractères de contrôle sont réellement supprimés de votre saisie.
La bonne chose à faire est de placer votre script sur une seule ligne entre guillemets simples:
perl -pe 's/\x1a//g' foo.txt > out.txt
Je ne sais pas comment vous vous assurez que la première version fonctionne, mais ce n’est pas pour moi.
Vous devez soit échapper à la barre oblique inverse dans le regex, soit le citer (en le citant plus fréquemment).
$ hexdump -C input 00000000 61 62 63 1a 64 65 66 1a 67 68 69 0a |abc.def.ghi.| $ perl -pe s/\x1a//g input | hexdump -C 00000000 61 62 63 1a 64 65 66 1a 67 68 69 0a |abc.def.ghi.| $ perl -pe s/\\x1a//g input | hexdump -C 00000000 61 62 63 64 65 66 67 68 69 0a |abcdefghi.| $ perl -pe 's/\x1a//g' input | hexdump -C 00000000 61 62 63 64 65 66 67 68 69 0a |abcdefghi.|
Ce que j’ai finalement fini par faire (même si j’ai découvert que la solution de la foule fonctionnait aussi) était qu’au lieu d’entrer dans \x1a
j’ai appuyé et maintenu Ctrl
, puis v, z
Cela a aussi l’avantage d’être un peu plus lisible.