Como usar o gnu sort para classificar linhas com delimitador de campo presente apenas em algumas linhas

Como usar o gnu sort para classificar linhas com delimitador de campo presente apenas em algumas linhas

No meu .vimrc listo meus pacotes vundle assim:

cat ~/.vimrc

...
Bundle 'Raimondi/delimitMate'
Bundle 'kien/ctrlp.vim'
Bundle 'matchit.zip'
Bundle 'upAndDown'
Bundle 'rking/ag.vim'
...

Agora, gostaria de classificar rapidamente minha lista de pacotes pelo nome dos pacotes, que funciona para linhas onde /está presente, assim:

cat ~/.vimrc | sort -t "/" -k2,2

...
Bundle 'matchit.zip'
Bundle 'upAndDown'
Bundle 'rking/ag.vim'
Bundle 'kien/ctrlp.vim'
Bundle 'Raimondi/delimitMate'
...

Como eu classificaria as linhas onde não há nenhum foo/prefixo no nome do pacote, como é o caso, por exemplo, de Bundle 'matchit.zip'?

Responder1

Você sempre pode acrescentar a ./e removê-lo novamente. Por exemplo:

sed "/\// ! s:^Bundle[[:space:]][[:space:]]*':&./:" ~/.vimrc |
  sort -t "/" -k2,2 |
  sed "s:\(^Bundle[[:space:]][[:space:]]*\)'\./:\1:"

Ou com GNU sed, isso pode ser ligeiramente reduzido com expressões regulares estendidas:

sed -r "/\// ! s:^Bundle[[:space:]]+:&./:" ~/.vimrc |
  sort -t "/" -k2,2 |
  sed -r "s:(^Bundle[[:space:]]+)'\./:\1:"

Ou apenas use um único espaço literal se tiver certeza de que o arquivo é consistente.

informação relacionada