Como posso encontrar caracteres ASCII estendidos em um arquivo usando Perl?
-
22-08-2019 - |
Pergunta
Como posso encontrar caracteres ASCII estendidos em um arquivo usando Perl? Alguém pode obter o script?
.....desde já, obrigado.....
Solução
Desde o estendido ASCII Os caracteres têm valor 128 e superior, você pode simplesmente ligar ord em caracteres individuais e lidar com aqueles com um valor> = 128. O código a seguir lê de Stdin e imprime apenas os caracteres ASCII estendidos:
while (<>) {
while (/(.)/g) {
print($1) if (ord($1) >= 128);
}
}
Alternativamente, Desembore junto com Chr também funcionará. Exemplo:
while (<>) {
foreach (unpack("C*", $_)) {
print(chr($_)) if ($_ >= 128);
}
}
(Tenho certeza de que algum Guru Perl pode condensar ambos a duas linhas de uma vez ...)
Para imprimir os números da linha, você pode usar o seguinte (isso não remove duplicatas e terá um comportamento estranho quando o Unicode for passado):
while (<>) {
while (/(.)/g) {
print($. . "\n") if (ord($1) >= 128);
}
}
(Obrigado Yaakov Belch para o $.
gorjeta.)
Outras dicas
O primeiro caractere ASCII imprimível é space
(32). O último caractere ASCII imprimível é ~
(126). Então eu provavelmente usaria
while (<>) {
print "$.\n" if /[^ -~]/;
}
Embora seja, reconhecidamente, também exibe linhas que contêm caracteres de controle, bem como ASCII estendido.
Editar: Alterado para imprimir o número da linha em vez da própria linha.
Oneliner:
perl -nE'say$.if/[\xE0-\xFF]/'
Para versões Perl mais antigas
perl -lne'print$.if/[\xE0-\xFF]/'
Uma questão crucial é se o
usar bytes;
Pragma deve estar em vigor. O pôster deve decidir isso. Para escolher personagens Com códigos maiores que 127, o seguinte será suficiente:
print grep 127 < ord, split // while <>;
ou
print grep /[^[:ascii:]]/, split // while <>;
Resposta de Hynek -Pichi -Vychodil:
perl -nE'say$.if/[\xE0-\xFF]/'
apenas testa uma parte limitada da não impressão, presumivelmente deve ser
perl -nE'say$.if/[\x80-\xFF]/'
em vez de.
E quanto a Grep?
grep [\x00-\x1F\x7F-\xFF]+ *