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).
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.
< 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
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