Você deve dar uma olhada usando hexdump -C
e encontrar os bytes em torno dele. Presumindo UTF-8, o que vi
mostra como <91>
(decimal 145, um ponto unicode sem significado no texto) seria dois bytes, 0xc2 e 0x91.
Está implícito que suas substituições não funcionaram, mas se o que você fez foi apenas substituir 0x91 por 0x27, você invalidará o UTF-8 (o segundo byte de uma sequência de dois bytes sempre terá o bit alto configurado , ou seja, é > = 0x80). Isso pode complicar sua análise, embora vi
deva mostrá-la como ?'
.
Dito isto, testei isto e funciona:
#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);
my $data = "";
my $file = $ARGV[0];
while (<>) {
s/\xc2\x91/'/g;
$data .= $_;
}
open my $out, '>', $file || die "Could not write $file.";
print $out $data;
close $out;
Se $ARGV[0]
existe quando <>
é referenciado, perl extrai isso da pilha de argumentos e o usa como um caminho de arquivo para usar (acho que scripts curtos são mais fáceis de ajustar e trabalhar com um forro, BTW). Isso se acumula na memória (bem, desde que os arquivos não sejam grandes), enquanto perl -i
renomeia o arquivo original para evitar condições de corrida edit-in-place (veja perldoc perlrun
).
Então você pode usar isso:
find . -name "*.txt" -exec whatever.pl {} +