Regex para grep filler seguido por float assinado

Regex para grep filler seguido por float assinado

Quero extrair a última coluna de linhas semelhantes a:

880.952         NAV_Y                uSimMarine      -146.17516

O número nem sempre é negativo e não tem comprimento fixo (ou seja, nem sempre tem o mesmo número de casas decimais).

Isso me leva até lá:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

Exceto que também corresponde ao número na primeira coluna.

Se eu alterar isso para incluir o final da linha para eliminar as correspondências da primeira coluna:

grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

Não consigo correspondências, o que não entendo.

O que estou perdendo aqui?

Responder1

Ancore a expressão no final da linha:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

Se você adicionar a opção PCRE de -oretornar apenas o grupo capturado, verá que seu exemplo corresponde e retorna a correspondência desejada:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"

-146.17516

Além disso, para capturar correspondências de linhas em um arquivo com espaço em branco opcional, basta adicionar \s*como:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"

Responder2

Precedendo o primeiro regexp com um espaço:

grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

deve funcionar, pois exclui a correspondência no início da linha.

Se você quiserapenasna quarta coluna, você pode conseguir isso facilmente com GNU sed:

sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'

onde \sestá qualquer caractere de espaço em branco (espaço, tabulação e os vários "feeds" 1 ) e \Sum caractere que não seja espaço, ou (de uma forma muito mais limpa) com sed | cut:

sed 's/\s\+/\t/g' | cut -f4

que primeiro compacta todos os espaços em uma única guia e depois corta cuta quarta coluna. Também permite escolher mais colunas facilmente, por exemplo, com cut -f1,4e assim por diante.

1) Ou seja: avanço de formulário, avanço de linha, retorno de carro, embora o do meio geralmente seja interpretado sedcomo separador de linha.

informação relacionada