entender padrões no vim [duplicado]

3

Eu tenho o seguinte arquivo:

8635147+876+5597+1686+54=8643360
2415+382376+88324+81544+926+68619475+677+222852=69398589
80+21+4478882+8945092=13424075
62+9598=9660
16832904+537+51460155+6822+2+4901436+47443+5669+855928+8113549+424282=82648727
33+9872=9905
555839
5017598+5639262+4+62+9413+4+4991+41568=10712902
4977+164+77+1018643+593851+83730=1701442
220+6831+26=7077
5+54102+1034451=1088558
37844
1
35+2983325+0+6400=2989760
8081+8361365+6+477=8369929
66+68232+9406935+6489662=15964895
6569+59336692+75+11328=59354664
28332+725+2683+45913425+9648987+4911=55599063
69724687+8+7+9940+5568+29585+518916=70288711
1804642
659157+5144361+7072+16+4799+811+58742059+451875+138174=65148324
2288508+509472+43+83704=2881727
872027+1115415+1+47922+547008+56+5550+71642773+948394=75179146
142

Gostaria de classificar isso em vim para isso:

16832904+537+51460155+6822+2+4901436+47443+5669+855928+8113549+424282=82648727
872027+1115415+1+47922+547008+56+5550+71642773+948394=75179146
69724687+8+7+9940+5568+29585+518916=70288711
2415+382376+88324+81544+926+68619475+677+222852=69398589
659157+5144361+7072+16+4799+811+58742059+451875+138174=65148324
6569+59336692+75+11328=59354664
28332+725+2683+45913425+9648987+4911=55599063
66+68232+9406935+6489662=15964895
80+21+4478882+8945092=13424075
5017598+5639262+4+62+9413+4+4991+41568=10712902
8635147+876+5597+1686+54=8643360
8081+8361365+6+477=8369929
35+2983325+0+6400=2989760
2288508+509472+43+83704=2881727
1804642
4977+164+77+1018643+593851+83730=1701442
5+54102+1034451=1088558
555839
37844
33+9872=9905
62+9598=9660
220+6831+26=7077
142
1

Eu posso fazer isso com :sor!n/.*\</ . Pelo que entendi, \< significa o começo de uma palavra. No entanto, por que não simplesmente :sor!n/.*=/ funciona? Ou se = for um caractere especial no padrão, então eu esperaria que :sor!n/.*\=/ funcione, mas isso gera um erro NFA regex .

    
por Martin 28.07.2016 / 01:44

2 respostas

5

Isso pode ser mais adequado para o link

Mas, de qualquer forma, :h :sort explica o que está acontecendo lá:

If a {pattern} is used, any lines which don't have a
match for {pattern} are kept in their current order,
but separate from the lines which do match {pattern}.
If you sorted in reverse, they will be in reverse
order after the sorted lines, otherwise they will be
in their original order, right before the sorted
lines.

Em palavras simples, .*\< corresponde a todas as linhas na entrada e :sort é executada em todas as linhas.

Embora .*= corresponda apenas às linhas que contêm = , essas linhas são classificadas por :sort . Todas as linhas restantes (aquelas que não corresponderam ao padrão):

142
1804642
1
37844
555839

Não são classificados, mas são simplesmente descartados no início do arquivo. Graças ao fato de que você está usando ! , a ordem de todas as linhas é invertida, então elas terminam no final do arquivo e na ordem inversa.

    
por 28.07.2016 / 03:45
2

Para complementar a boa resposta do grochmal , você pode usar

:sort!n/.*=\|^/

Ou:

:sort!n/[^=]*$/r

Para obter o resultado desejado.

Quanto ao motivo pelo qual \= apresenta um erro, é porque é um operador regex especial em vim . É o mesmo que \? , exceto que também pode ser usado no comando ? . .*\= mesmo que .*\? seria então um regexp inválido.

    
por 28.07.2016 / 07:20

Tags