Linhas de correspondência que não terminam com um caractere específico

2

Eu tenho aprendido comandos do linux e recebi este erro. Meu texto está aqui:

Fred apples 20
Susy oranges 12 
Mark watermellons 12
Robert pears 4
Terry oranges 9
Lisa peaches 7
Egemen aaaa 12
Susy oranges 12
Mark grapes 39
Anne mangoes 7
Greg pineapples 3
Oliver rockmellons 2
Betty limes 14

Pesquisei as linhas que não terminavam com 2 . Meu comando:

egrep '2.+' mysampledata.txt

Mas, curiosamente, tenho estas duas linhas:

Fred apples 20
Susy oranges 12

Eu tentei alguns outros argumentos para esses comandos e mudei a sequência das linhas. Eu não obtive nenhum resultado falso.

O que há de errado com essa construção?

    
por Egemen Sarımaden 22.02.2015 / 22:50

2 respostas

6

Se você quiser que as linhas não terminem com '2', tente o seguinte:

grep '[^2]$' <filename>

Aqui '$' corresponde ao final da linha, '[^ 2] significa algo diferente de' 2 '. Então, '[^ 2] $' significa corresponder a qualquer caractere diferente de '2' no final da linha.

Seu comando egrep '2.+' mysampledata.txt , procurará as linhas contendo '2' e, em seguida, qualquer caractere ocorrendo uma ou mais vezes. Então, a saída deve ser:

Fred apples 20

A linha adicional Susy oranges 12 pode ser devido a um space indevidamente colocado no final da linha.

Editar: O seguinte irá considerar também qualquer número de espaços em branco ou quaisquer caracteres não imprimíveis no final:

grep -v '2[[:blank:][:cntrl:]]*$' <filename>

Isso significa imprimir as linhas que não têm '2' ou '2' seguidas por qualquer número de espaços em branco ou caracteres de controle no final da linha.

    
por 22.02.2015 / 23:10
4

Você deve fazer:

grep -v '2 *$' mysampledata.txt

A opção -v inverte a correspondência. Isto suporta linhas com espaços no final, já que este é o caso no seu arquivo e você não parece querer

Susy oranges 12 $

a ser produzido (o $ aqui marca o fim da linha).

    
por 22.02.2015 / 23:16

Tags