Cómo usar gnu sort para ordenar líneas con delimitador de campo presente solo en algunas líneas

Cómo usar gnu sort para ordenar líneas con delimitador de campo presente solo en algunas líneas

En mi .vimrc enumero mis paquetes de vundle así:

cat ~/.vimrc

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

Ahora, me gustaría ordenar rápidamente mi lista de paquetes por el nombre del paquete, lo que funciona para las líneas donde /está presente, así:

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

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

¿Cómo ordenaría las líneas donde no hay foo/un prefijo al nombre del paquete, como es el caso, por ejemplo, de Bundle 'matchit.zip'?

Respuesta1

Siempre puedes anteponer a ./y luego eliminarlo nuevamente. P.ej:

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

O con GNU sed, esto se puede acortar ligeramente con expresiones regulares extendidas:

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

O simplemente utilice un único espacio literal si está seguro de que el archivo es coherente.

información relacionada