AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 735085
Accepted
Ray Andrews
Ray Andrews
Asked: 2023-02-11 01:48:31 +0800 CST2023-02-11 01:48:31 +0800 CST 2023-02-11 01:48:31 +0800 CST

perl tem problema se nomes de arquivos contiverem traços

  • 772
... | perl -pe "s/([^$filespec]*)($filespec)/ ...

Portanto, tenho uma função em que a construção acima funciona bem se $filespecfor a maioria das coisas. No entanto , se houver um traço no nome do arquivo, recebo uma Invalid [] rangemensagem.

Como posso garantir que a variável $filespecse expanda para um nome de arquivo protegido desse tipo de erro de análise?

regular-expression
  • 2 2 respostas
  • 79 Views

2 respostas

  • Voted
  1. Best Answer
    pmqs
    2023-02-12T00:15:17+08:002023-02-12T00:15:17+08:00

    Suposição chave -- $filespecé apenas um conjunto de caracteres que você deseja corresponder. Não é uma expressão regular.

    Vamos simular o problema com algum código

    filespec = 'z-a'
    perl -e 'print "MATCH\n" if "DEF" =~ /$filespec/'
    
    
    use strict;
    use warnings;
    
    my $filespec = 'z-a';
    
    print "Match\n" if "DEF" =~ m/[^$filespec]/ ;
    

    Correr que dá

    Invalid [] range "z-a" in regex; marked by <-- HERE in m/[^z-a <-- HERE ]/ at try line 6.
    

    O problema é acionado quando $filespecé expandido em sua expressão regular para m/[^z-a]/. Neste caso, z-aé um intervalo de caracteres inválido.

    Para consertar você precisa escapar (pelo menos) do -in $filespec. O uso quotemetadeve fazer com que o problema desapareça, assim

    use strict;
    use warnings;
    
    my $filespec = quotemeta 'z-a';
    
    print "Match\n" if "DEF" =~ m/[^$filespec]/ ;
    

    saída é

    Match
    

    Incluir isso em uma simulação de seu comando de pipeline. Primeiro, a versão do comando com falha

    filespec='z-a'
    perl -e "print qq[MATCH\n] if 'DEF' =~ /[^$filespec]/"
    

    correr dá

    Invalid [] range "z-a" in regex; marked by <-- HERE in m/[^z-a <-- HERE ]/ at -e line 1.
    

    e aqui está a versão corrigida

    filespec='z-a'; 
    filespec=`perl -e "print quotemeta qq[$filespec]"`
    perl -e "print qq[MATCH\n] if 'DEF' =~ /[^$filespec]/"
    
    • 1
  2. cas
    2023-02-12T19:28:57+08:002023-02-12T19:28:57+08:00

    Um traço em uma expressão de colchetes é tratado como um intervalo, a menos que seja escapado com uma barra invertida 1 ou seja o primeiro ou o último caractere na expressão (ou, se a expressão for negada com ^o primeiro caractere após ^ou o último caractere).

    por exemplo

    [a-z]corresponde a todos os caracteres minúsculos de aa z (mas veja a nota 2)

    [a\-z], [-az], e [az-]todos correspondem a apenas 3 caracteres: -, a, e z.

    E, como @pmqs aponta em sua resposta, [z-a]é um intervalo inválido e gerará um erro.

    Se sua expressão regular contiver uma expressão de colchetes com um ou mais traços, você precisará modificá-la para que funcione conforme o esperado. Como na maioria das coisas, cabe a você entender o software e os recursos de linguagem que está usando bem o suficiente para fazê-los fazer o que você deseja/espera.

    Consulte man perlrepara obter detalhes sobre expressões regulares perl, incluindo recursos de conveniência e outras "pegadinhas" das quais você precisa estar ciente. Há muito nessa página de manual, você não vai dominar tudo de uma vez. Consulte-o novamente quando precisar, pois você aprenderá mais sobre como ele funciona nos próximos anos. Consulte também man perlrequickpara obter uma referência rápida e man perlretutum tutorial. E man perlrecharclasspara saber mais sobre classes de caracteres e expressões de colchetes em perl. E man perlrebackslashpara saber mais sobre barras invertidas e sequências de escape em perl.

    (Se sua distribuição linux ou unix não tiver documentação perl disponível como manpáginas, use perldoccomo comando para executar em vez de man, por exemplo perldoc perlre).

    Dado que o perl tem cinco man pages principais, totalizando cerca de 54.000 palavras em prosa e exemplos dedicados apenas a expressões regulares (e mais duas que você provavelmente nunca precisará: perlregutsdescrevendo como o mecanismo perl regex funciona e perlreapidescrevendo a interface do plug-in do perlre), você pode estar começando a adivinhar que é um tópico complexo - e você estaria certo sobre isso.


    Notas:

    1 nem todos os mecanismos regex suportam caracteres de escape dentro de uma expressão de colchetes. Perl faz, a maioria não - por exemplo, BRE do GNU grep (padrão, ou -G) e ERE ( -E) não, mas -Pregexes compatíveis com perl ( ) do GNU grep sim.

    2 [[:alpha:]] , [[:upper:]]ou [[:lower:]]geralmente são melhores para combinar caracteres alfabéticos, pois podem funcionar com texto unicode e também com ASCII simples. Assim como [[:alnum:]]para caracteres alfanuméricos.

    • 1

relate perguntas

  • Como remover alguns caracteres após uma partida?

  • Processe arquivos Unicode com BOM corretamente com ferramentas POSIX

  • Por que a expressão regular não corresponde à entrada com o comando sed [duplicado]

  • Converter senha com caracteres especiais para uso com script esperado

  • menos: várias condições de filtro com AND

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve