Como posso modificar seletivamente as linhas em um arquivo onde as modificações dependem da análise das linhas selecionadas como um todo, em vez de individualmente [duplicadas]?

1
    

Esta pergunta já tem uma resposta aqui:

    

TL; DR Eu preciso alinhar as colunas das entradas no fstab enquanto ignoro os comentários:

/dev/foo              /foo         ext4        defaults   0    2
# comment line 1
/dev/bar /bar ext4 defaults 0 2
# comment line 2
UUID=1234567890     /baz      ext4      defaults   0       2

deve se tornar

/dev/foo         /foo  ext4  defaults  0  2
# comment line 1
/dev/bar         /bar  ext4  defaults  0  2
# comment line 2
UUID=1234567890  /baz  ext4  defaults  0  2

em, idealmente, um comando swooping.

</tldr>

Meu fstab consiste em um grande bloco de documentação nas linhas de comentário, terminando com as descrições dos campos e, finalmente, as entradas. Existem linhas de comentário intercaladas na seção de entrada.

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>

# table entries begin ...

Gostaria de alinhar colunas nas linhas de entrada usando o comando column -t ou equivalente, mas quero ignorar os comentários. Se eu não ignorar as linhas de comentário, elas serão submetidas a alinhamento. Ao editar o arquivo no vim, posso selecionar visualmente as linhas da primeira entrada em diante e executar '<,'> !grep '^[^\#]' | column -t , mas o grep filtrará as linhas de comentário e, como resultado, elas não estarão presentes na saída, o que substitui a seleção no vim. Não consigo executar o comando column em cada linha correspondente individualmente porque column não funciona dessa maneira.

Existe um comando simples que realiza essa tarefa? Não precisa ser realizável no vim, pois posso simplesmente delegá-lo a um comando externo de dentro.

    
por okwa 16.12.2015 / 06:38

1 resposta

1

tr -s \[:blank:] \  </etc/fstab |       # squeeze all tabs/spaces to 1 space
sed 's/^#/ # # # # # #/'        |       # create 6 tiny comment fields
column -t                       |       # get columns
sed '/^\( *#\)\{6\}/{s//#/;s/  */ /g;}' # fix and squeeze spaces for comments
    
por 16.12.2015 / 08:24