como encontrar a localização inicial de uma substring variável em uma string mais longa

1

Eu tenho essas 200 caracteres longas armazenadas em um arquivo. Em cada string, existe um padrão como ##XXX###XXXX onde # é um dígito entre 0 e 9 e X é um caractere entre A e Z em maiúsculas ou minúsculas. Os caracteres iniciais e finais podem ser qualquer caractere imprimível, incluindo espaço, mas diferente de [0-9] , [a-z] e [A-Z] . E o tamanho dessa string também não é fixo, mas não menos que 180 caracteres, a maioria é mais de 200.

Tudo que eu preciso é o local inicial do padrão na string mais longa, como a função index em perl retorna. Minha advertência é que não há perl neste sistema sem nenhuma chance adicional de instalação de software.

Até agora, o que eu consegui pensar foi começar do primeiro caractere da string e verificar se o caractere que obtive é um dígito. Se sim, verifique o segundo por ser um dígito. Até agora e assim por diante ... repita até que todos os 12 caracteres sejam satisfeitos, usando instruções if em cascata e quebrando o loop se a condição na cadeia de comparação retornar um caractere insatisfatório antes de atingirmos a contagem de 12.

Eu queria saber se há alguma coisa que possa ser feita com regex ou sem, eliminando a necessidade de 12 instruções if em cascata. E sim, eu tenho acesso a sed e awk se qualquer um deles facilitar a vida.

    
por TravelFreak 06.01.2016 / 22:39

3 respostas

0

O Awk tem uma função match que faz algo que parece com o que você quer

awk '{ print match($0, /[0-9][0-0]rest_of_your_pattern/) }' your_file

Se nenhuma correspondência for encontrada, a correspondência retornará 0 (e impressa).

    
por 06.01.2016 / 22:56
2
< your_file \
tr -c \[:alnum:] '[\n*]' |
grep -n ............

... provavelmente? strings também é muito útil com isso ...

< your_file \
tr -c \[:alnum:] '[
< your_file \
tr -c \[:alnum:] '[\n*]' |
grep -n ............
*]' | strings -n12 -td
    
por 06.01.2016 / 23:08
0

Nenhuma ferramenta externa chamada (mais rápida?):

while IFS= read -r a; do
    head=${a%%[[:alnum:]]*}
    tail=${a##*[[:alnum:]]}
    a=${a##"$head"}
    b=${a%%"$tail"}
    printf '%4d <%s>\n' "${#head}" "$b"
done < file.csv
    
por 07.01.2016 / 07:06

Tags