Regex para grep filler seguido por float assinado

0

Eu quero extrair a última coluna das linhas que se parecem com:

880.952         NAV_Y                uSimMarine      -146.17516

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

Isso me deixa mais do caminho:

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 fim da linha para eliminar as correspondências da primeira coluna:

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

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

O que estou perdendo aqui?

    
por jake 07.10.2014 / 21:34

2 respostas

4

Ancore a expressão até o final da linha:

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

Se você adicionar a opção PCRE de -o para retornar 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* as:

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

Precedendo o primeiro regexp com um espaço:

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

deve fazer o truque, pois exclui a correspondência no começo da linha.

Se você quiser apenas na 4ª coluna, você pode facilmente conseguir isso com o GNU sed:

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

onde \s é qualquer caractere de espaço em branco (espaço, tabulação e os vários "feeds" 1 ) e \S um caractere não espacial, ou (de uma maneira 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, em seguida, usa cut para recortar a quarta coluna. Também permite escolher mais colunas com facilidade, por ex. com cut -f1,4 e assim por diante.

1) Ou seja: feed de formulário, feed de linha, retorno de carro, embora o do meio geralmente seja interpretado por sed como separador de linha.

    
por 07.10.2014 / 21:49