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?
Usando uma
grep
implementação que conhece o-o
sinalizador etr
:Este é um
sh
script (nãobash
, embora também funcionebash
). 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]*booklets
irá 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á retornadogrep
. Otr
simplesmente exclui qualquer coisa na saídagrep
que não seja um dígito ou nova linha.O
tr
poderia ser substituído porsed 's/[^0-9].*//'
, que exclui tudo do primeiro caractere não-dígito na string.Testando:
Observe que strings com espaços precisam ser citadas.
O operador de teste condicional do Bash
[[
pode comparar nomes de arquivos com uma expressão regular e extrair expressões entre parênteses: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:
... e depois chame:
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ídaO arquivo de entrada chamado
inputfile
arquivo:Uso:
O
pythonscript.py
contém:A saída:
Você pode tentar este sed