La commande d’échange de Perl ne semble pas fonctionner avec la redirection de sortie

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.