Como posso remover todos os comentários de um arquivo?

18

Eu tenho um arquivo com comentários:

foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this

Eu só quero imprimir todo o código não comentado:

foo
bar
stuff
morestuff
evenmorestuff

Ser capaz de retirar comentários de um arquivo é tão importante ... O que é uma boa maneira de fazer isso?

    
por Questionmark 24.09.2014 / 22:02

11 respostas

33

Uma forma de remover todos os comentários é usar grep com -o option:

grep -o '^[^#]*' file

onde

  • -o : imprime apenas parte da linha
  • primeiro ^ : início da linha
  • [^#]* : qualquer caractere, exceto # , repetido zero ou mais vezes

Observe que as linhas vazias também serão removidas, mas as linhas com apenas espaços permanecerão.

    
por 26.09.2014 / 03:09
25

Acredito que sed pode fazer um trabalho muito melhor do que grep . Algo parecido com isto:

sed '/^[[:blank:]]*#/d;s/#.*//' your_file

Explicação

  • Por padrão, sed examinará seu arquivo linha por linha e imprimirá cada linha depois de possivelmente aplicar as transformações entre aspas. ( sed '' your_file apenas imprimirá todas as linhas inalteradas).
  • Aqui estamos dando sed dois comandos para executar em cada linha (eles são separados por um ponto-e-vírgula).
  • O primeiro comando diz: /^[[:blank:]]*#/d . Em inglês, isso significa que se a linha corresponder a um hash em seu início (precedido por qualquer número de espaços em branco à esquerda), exclua essa linha (ela não será impressa).
  • O segundo comando é: s/#.*// . Em Inglês isto é, substitua um hash mark seguido por tantas coisas quanto você pode encontrar (até o final da linha, isto é) sem nada (nada é o espaço vazio entre os dois finais // ).
  • Em resumo, isso será executado em seu arquivo excluindo linhas que consistam inteiramente em comentários e quaisquer linhas deixadas depois disso terão os comentários excluídos delas.
por 26.09.2014 / 05:09
4

Você pode obter a saída necessária usando o comando sed. O comando abaixo fez o truque para mim.

sed 's/#.*$//g' FileName

Onde

  • #.*$ - O Regexp filtrará toda a string que começa com # até o final da linha

Aqui, precisamos remover essas linhas, então substituímos por vazias, de modo a pular a parte de 'substituição'.

  • g - mencionando a pesquisa repetida do padrão até o final do arquivo ser atingido.

Sintaxe geral de sed: s/regexp/replacement/flags FileName

    
por 26.09.2014 / 09:02
3

Você pode usar a correspondência invertida assim:

    #grep -v "#" filename

-v, --invert-match               Inverta o sentido de correspondência para selecionar linhas não correspondentes. (-v é especificado por POSIX.)

    
por 24.09.2014 / 22:10
3

Eu gosto da resposta de joseph, mas precisava desmembrar // os comentários também, então eu os modifiquei ligeiramente & testado no redhat

# no comments alias
alias nocom="sed -E '/^[[:blank:]]*(\/\/|#)/d;s/#.*//' | strings"

# example
cat SomeFile | nocom | less

Aposto que há uma maneira melhor de remover linhas em branco do que usar strings, mas foi o & solução suja que eu usei.

-cheers

    
por 18.05.2016 / 20:37
3

Isso funcionou para mim

sed -i.old -E  "/^(#.*)$/d" file 
    
por 02.09.2016 / 16:50
2
cat YOUR_FILE | cut -d'#' -f1

Ele usa # como separador de coluna e mantém apenas a primeira coluna (isso é tudo antes de # ).

    
por 03.08.2015 / 11:02
2

Use expressões como

egrep -v "#|$^" <file-name> 

: - v: fará o jogo invertido

: #: corresponderá a todas as linhas que começam com #

: $ ^: corresponderá a todas as linhas em branco

    
por 09.10.2016 / 20:08
2

A melhor solução seria usar o comando:

sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf

O -i é a edição no local, mas o prefixo que segue diretamente diz ao sed para criar um backup. Nesse caso, com uma extensão de data (ntp.conf.date), executamos dois comandos, cada um com um espaço de endereço, o primeiro exclui as linhas comentadas e o segundo, separado do primeiro por um ponto e vírgula, exclui as linhas em branco. / p>

Encontrei esta solução em: theurbanpenguin.com

    
por 12.01.2018 / 17:57
2

Como outros apontaram, sed e outras ferramentas baseadas em texto não funcionarão bem se alguma parte de um script parecer comentários, mas na verdade não são. Por exemplo, você pode encontrar um # dentro de uma string, ou o bastante comum $# e ${#param} .

Eu escrevi um formatador de shell chamado shfmt , que tem um recurso para reduzir o código. Isso inclui a remoção de comentários, entre outras coisas:

$ cat foo.sh
echo $# # inline comment
# lone comment
echo '# this is not a comment'
[mvdan@carbon:12] [0] [/home/mvdan]
$ shfmt -mn foo.sh
echo $#
echo '# this is not a comment'

O analisador e a impressora são pacotes Go, portanto, se você quiser uma solução personalizada, deve ser bastante fácil escrever um programa Go de 20 linhas para remover comentários da maneira exata que você deseja.

    
por 11.03.2018 / 20:19
1

Nenhuma das outras respostas parece fazer justiça, ou elas saem em linhas vazias, ou deixam em linhas onde o comentário não está no primeiro caractere. Acabei usando isso:

cat << EOF >> ~/.bashrc
alias nocom='sed -e "/^\s*#/d" -e "/^\s*$/d"'
EOF

Isso configura um alias, para que você não precise memorizá-lo (o que é impossível começar com). Abra uma nova sessão e você terá o novo comando nocom . Então você pode apenas

nocom /etc/foobar.conf

Felicidades.

    
por 26.07.2018 / 16:29