Como usar o sed para remover "(aspas duplas) em linhas de código, deixando-as em linhas de comentário reais em um arquivo vimrc?

0

No Ubuntu (Server / Desktop), desejo remover um único caractere " (aspas duplas) do início das linhas no meu /etc/vim/vimrc .

Isso deve ser feito para todas as linhas que começam com " , mas não se o " for seguido por um caractere de espaço único , pois o último indica real comentários (em oposição ao código comentado). Meu objetivo é alternar o código comentado removendo o " inicial, deixando o restante do arquivo inalterado.

ANTES:

" Vim will load $VIMRUNTIME/defaults.vim if the user does not have a vimrc.
" This happens after /etc/vim/vimrc(.local) are loaded, so it will override
" any settings in these files.
" If you don't want that to happen, uncomment the below line to prevent
" defaults.vim from being loaded.
" let g:skip_defaults_vim = 1

" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'.  Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
"set compatible

" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
if has("syntax")
  syntax on
endif

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
"set background=dark

" Uncomment the following to have Vim jump to the last position when
" reopening a file
"if has("autocmd")
"  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"endif

DEPOIS:

" Vim will load $VIMRUNTIME/defaults.vim if the user does not have a vimrc.
" This happens after /etc/vim/vimrc(.local) are loaded, so it will override
" any settings in these files.
" If you don't want that to happen, uncomment the below line to prevent
" defaults.vim from being loaded.
" let g:skip_defaults_vim = 1

" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'.  Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
"set compatible

" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
if has("syntax")
  syntax on
endif

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark

" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif

DIFF:

~$ diff BEFORE.out AFTER.out 
21c21
< "set background=dark
---
> set background=dark
25,27c25,27
< "if has("autocmd")
< "  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
< "endif
---
> if has("autocmd")
>   au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
> endif

Observe que, se houver um código recuado, o " inicial será seguido por um número de caracteres de espaço maiores que um: Desejo remover o comentário dessas linhas também, preservando o recuo.

Eu descobri como fazer as coisas funcionarem com o seguinte comando:

$ sudo sed -i.orig '/^\" [a-zA-Z]\|^"set compatible\|^\" let g:skip_defaults_vim = 1b/! s/^\"//' /etc/vim/vimrc

Isso pode ser feito melhor (mais limpo / mais apertado / etc.)?

Isso também pode ser feito usando awk para o mesmo resultado?

    
por Chris Rainey 11.09.2018 / 19:13

1 resposta

0

O comando de substituição é muito simples:

sed -r 's/^"(\S|\s{2,})//' /etc/vim/vimrc

Ou similarmente em Perl:

perl -lape 's/^"(\S|\s{2,})//' /etc/vim/vimrc

e AWK:

awk '{$0=gensub(/^"(\S|\s{2,})/,"\1",1)}1' /etc/vim/vimrc

No seu exemplo, você parece estar especificando exceções para linhas que contêm determinadas cadeias.
Isso não é explicado em seu texto, mas pode ser adicionado como uma condição:

sed -r '/^"set compatible/! s/^"(\S|\s{2,})//' /etc/vim/vimrc
perl -lape 's/^"(\S|\s{2,})// if!/^"set compatible/' /etc/vim/vimrc
awk '!/^"set compatible/ {$0=gensub(/^"(\S|\s{2,})/,"\1",1)}1' /etc/vim/vimrc
    
por 12.09.2018 / 11:52