Pergunta

Como posso encontrar caracteres ASCII estendidos em um arquivo usando Perl? Alguém pode obter o script?

.....desde já, obrigado.....

Foi útil?

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]+ *
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top