Sed ou outro script e a solução regexp para cortar um nome de arquivo

1

O que eu preciso é obter 2-3 variáveis de nomes de arquivos. Eu uso:

FILES=$(ls -tr .../Files/)

for f in $FILES;
    do
......

Os arquivos são assim:

[letras e / ou números e (sublinhado ou nada)] [número de 6 dígitos] [sublinhado e máximo 6 caracteres ou número, ou nada] [.] [extensão]

Eu preciso da primeira parte [] do número seis didigt e do sublinhado + caracteres, se existir. Então o 1. [] o 2. [] e o 3. [].

O que eu tentei:

echo sanyi_123456_m2.txt | sed -e "s/^\(\w{4,40}\)\_?\(\d{6}\)\_?\(\w{,6}\)?\(\.\w{2,4}$\)/\1 \2 \3/g"

O que eu preciso disso:

sanyi_ 123456 _m2

Alguém poderia me ajudar com a solução de expressão regular?

Muito obrigado

    
por Zalan 18.07.2018 / 12:15

3 respostas

1

Primeiro de tudo, há muitas barras invertidas. Além disso, sendo ganancioso, seu primeiro globo irá devorar toda a corda até o ponto. Você pode limpar a imagem usando regexps estendidos. O segundo sublinhado é dependente da última parte (de acordo com sua descrição) deve ser entre parênteses. Você não precisa do quarto glob (em sua versão).

Algo parecido com isto:

 echo sanyi_123456_m2.txt | sed -r "s/^([a-z]{4,40})_?([0-9]{6})(_(\w{,6}))?\.\w{2,4}$/  /g"

Você também pode usar expressões regulares perl onde a quantificação não-gulosa é possível.

    
por 18.07.2018 / 13:14
1

A solução perfeita foi esta:

$ echo sanyi123456_654321_987654.txt | sed -r "s/^([^_]{4,}_?)([0-9]{6})(_(\w{,6}))?\.\w{2,4}$/  /g"

É uma versão modificada dos que a comunidade deu, muito obrigada por isso. Até agora funciona com esses formatos (todos atualmente):

karfiol_123123.txt

karfiol_123123_mpf123.txt

karfiol123123.txt

karfiol123123_123123.txt

karfiol123123_123123_123123.txt

karfiol123123_123123_mpf123.txt

karfiol123123_mpf123.txt

Obrigado novamente

    
por 19.07.2018 / 14:50
0

Esta expressão regexp fará o trabalho:

echo "hehehehaha_123456_bc34.meh"|sed 's/\([^_]\+_\?\)\([0-9]\{,6\}\)\(_\w\{,6\}\)\?\..*/  /'

Infelizmente, você precisa escapar de quase tudo quando usa sed, daí a fealdade.

    
por 18.07.2018 / 13:01

Tags