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 / 434584
Accepted
Brian Fitzpatrick
Brian Fitzpatrick
Asked: 2018-03-31 14:09:03 +0800 CST2018-03-31 14:09:03 +0800 CST 2018-03-31 14:09:03 +0800 CST

Como posso extrair um número de um nome de arquivo que ocorre antes de uma determinada string?

  • 772

tenho muitos arquivos

101s18-exam02--100-booklets.pdf
MATH232 Exam 01 99 booklets.pdf
35BOOKLETS.pdf

Desejo escrever um comando que extraia o número de cada arquivo que ocorre antes da palavra "booklets" (onde maiúsculas e minúsculas são ignoradas). Portanto, a saída da execução deste comando deve resultar em

$ bash mycommand.sh 101s18-exam02--100-booklets.pdf
100

$ bash mycommand.sh MATH232 Exam 01 99 booklets.pdf
99

$ bash mycommand.sh 35BOOKLETS.pdf
35

Como posso fazer isso?

bash awk
  • 4 4 respostas
  • 1456 Views

4 respostas

  • Voted
  1. Kusalananda
    2018-04-01T00:42:37+08:002018-04-01T00:42:37+08:00

    Usando uma grepimplementação que conhece o -osinalizador e tr:

    #!/bin/sh
    
    printf '%s\n' "$@" | grep -oiE '[0-9]+[^0-9]*booklets' | tr -dc '0-9\n'
    

    Este é um shscript (não bash, embora também funcione bash). Ele assume que nenhuma string passada para ele na linha de comando tem uma nova linha literal incorporada a ele.

    A expressão regular estendida [0-9]+[^0-9]*bookletsirá corresponder a qualquer string que se pareça com <integer><zero or more non-digit characters><"booklets">e com -o, isso é exatamente o que será retornado grep. O trsimplesmente exclui qualquer coisa na saída grepque não seja um dígito ou nova linha.

    O trpoderia ser substituído por sed 's/[^0-9].*//', que exclui tudo do primeiro caractere não-dígito na string.

    Testando:

    $ sh script.sh 101s18-exam02--100-booklets.pdf
    100
    $ sh script.sh "MATH232 Exam 01 99 booklets.pdf"
    99
    $ sh script.sh 35BOOKLETS.pdf
    35
    
    $ sh script.sh 101s18-exam02--100-booklets.pdf "MATH232 Exam 01 99 booklets.pdf" 35BOOKLETS.pdf
    100
    99
    35
    

    Observe que strings com espaços precisam ser citadas.

    • 3
  2. Best Answer
    Jeff Schaller
    2018-04-10T03:17:04+08:002018-04-10T03:17:04+08:00

    O operador de teste condicional do Bash [[pode comparar nomes de arquivos com uma expressão regular e extrair expressões entre parênteses:

    shopt -s nocaseglob
    for f in *booklets*
    do
      [[ $f =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}"
    done
    

    Isso fará um loop em todos os arquivos correspondentes que tenham a palavra (sem distinção entre maiúsculas e minúsculas) "booklets" no diretório atual. Se você deseja que algo seja executado em um único arquivo por vez, pode simplificar o acima e colocá-lo em um script ou função:

    extractnumber ()
    (
        shopt -s nocaseglob
        if [ ! -f "$1" ]; then echo "File $1 not found!"; return 1; fi
        [[ $1 =~ ([[:digit:]]+)[^[:digit:]]?booklets ]] && echo "${BASH_REMATCH[1]}";
    )
    

    ... e depois chame:

    $ extractnumber 35BOOKLETS.pdf
    35
    $ extractnumber MATH232\ Exam\ 01\ 99\ booklets.pdf
    99
    $ extractnumber 101s18-exam02--100-booklets.pdf
    100
    $ extractnumber foobar
    File foobar not found!
    
    • 2
  3. Praveen Kumar BS
    2018-03-31T20:26:33+08:002018-03-31T20:26:33+08:00

    Eu mencionei abaixo pythonscript.py e canalizei a saída para pesquisar as correspondências necessárias. Eu poderia ter usado apenas python, mas queria usar grep, então canalizei a saída

    O arquivo de entrada chamado inputfilearquivo:

    101s18-exam02--100-booklets.pdf
    MATH232 Exam 01 99 booklets.pdf
    35BOOKLETS.pdf
    

    Uso:

    python pythonscript.py |grep -o "^[0-9]*"
    

    O pythonscript.pycontém:

    #!/usr/bin/python
    import re
    o = open('inputfile','r')
    k=re.compile(r'\d{2,3}\s?-?booklets',re.IGNORECASE)
    for g in o:
        u=re.search(k,g)
        if u:
           print u.group()
    

    A saída:

    100
    99
    35
    
    • 1
  4. ctac_
    2018-04-01T08:27:52+08:002018-04-01T08:27:52+08:00

    Você pode tentar este sed

    sed -E '
      s/^/ /
      s/.*[^0-9]([0-9]+).?[bB][oO]{2}[kK][lL][eE][tT][sS].*/\1/
    ' infile
    
    • 1

relate perguntas

  • Embaralhamento de arquivo de várias linhas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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