rename comando com expressão perl

4

Eu posso usar o seguinte comando com sucesso e estou bastante confiante com este comando para fazer outras combinações:

'rename 's/\.htm/\.html/' *.htm'

No entanto, quero saber mais sobre isso, especialmente sobre s . Eles dizem que é uma expressão Perl. Eu não aprendi a linguagem de programação Perl, então não tenho idéia de por que existe tal argumento 's/\.htm/\.html/' . Você me diria o que é isso? Obrigado pela leitura.

    
por Smile 01.12.2017 / 11:31

1 resposta

4

Em geral, rename renomeia os nomes de arquivos fornecido de acordo com a regra especificada como o primeiro argumento do comando. Os nomes de arquivos são fornecidos pelos argumentos que seguem o primeiro.

O primeiro argumento no comando de exemplo ( rename 's/\.htm/\.html/' *.htm ) tem partes de pele, onde, neste caso, / é um delimitador dessas partes:

s/regexp/replacement/[flags]
  1. O comando s significa substituto: s/<old>/<new>/ . Combine a expressão regular com o conteúdo do espaço de padrão. Se encontrado, substitua a string correspondente pela substituição.

  2. Expressão regular que corresponde às strings que devem ser substituídas. No caso atual, esta é apenas a string .htm .

    Na maioria das expressões regulares, o ponto . corresponde a todos os caracteres. Neste caso, queremos usar o ponto literalmente, então precisamos escapar do seu significado especial usando a barra invertida \ (citando um único caractere).

  3. Substituição do sting / regexp correspondido a 2.

  4. Sinalizador que não é apresentado no exemplo atual. Pode ser, por exemplo, o sinalizador g - aplicar a substituição a todas as correspondências ao regexp, não apenas ao primeiro. Vamos supor que temos um arquivo chamado my.htm-file.htm :

    • O comando original rename 's/\.htm/\.html/' *.htm renomeará o arquivo desta forma: my.html-file.htm . Veja na parte inferior da resposta como evitar esse problema.

    • Ao adicionar o g flag - rename 's/\.htm/\.html/g' *.htm - o novo nome do arquivo será: my.html-file.html .

De acordo com os nomes dos arquivos: * pode representar qualquer número de caracteres (incluindo zero, em outras palavras, zero ou mais caracteres). O shell expandirá esse glob e passará os nomes de arquivos correspondentes como argumentos separados para rename So *.htm - corresponderá a todos os nomes de arquivos no caminho atual que terminam com a string .htm . Por exemplo, se você tiver 1.htm , 2.htm , 3.htm , 4.htm e 5.htm , então rename 's/\.htm/\.html/' *.htm transmitirá exatamente os mesmos argumentos para renomear a execução:

rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm

O comando inteiro ( rename 's/\.htm/\.html/' *.htm ) pode ser lido desta maneira:

rename '<substitute>/<the string ".htm">/<with the string ".html">/' <do it for all files in the current path that end with ".htm">

Vamos voltar ao exemplo quando tivermos um arquivo chamado my.htm-file.htm . Provavelmente, queremos alterar a última parte do nome do arquivo chamado de extensão após o último ponto. Para este propósito, devemos modificar o comando rename desta maneira:

rename 's/\.htm$/\.html/' *.htm

Onde o sinal $ corresponde ao final da linha e significa literalmente "ler para trás".

  

^ - Corresponde à cadeia nula no início do espaço padrão, ou seja,   o que aparece após o acento circunflexo deve aparecer no início do   espaço padrão. ( leia mais )

     

^ atua como um caractere especial apenas no início do período normal   expressão ou subexpressão (ou seja, após \( ou \| ). Portátil   scripts devem evitar ^ no início de uma subexpressão, embora,   POSIX permite implementações que tratam ^ como um caractere comum em   nesse contexto.

     

$ - É o mesmo que ^ , mas refere-se ao final do espaço de padrão. $ também   age como um caracter especial apenas no final da expressão regular   ou subexpressão (ou seja, antes de \) ou \| ) e seu uso no final de   uma subexpressão não é portável.

Referências:

por pa4080 01.12.2017 / 11:38

Tags