Como posso “cat” um arquivo e remover linhas comentadas?

26

Gostaria de saber se existe uma maneira de eu poder cat arquivar como php.ini e remover todas as linhas que começam com ;

Por exemplo, se o arquivo continha isso:

;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

e eu corri o comando correto cat | {remove comments command} , então eu acabaria com:

error_reporting  =  E_ALL & ~E_NOTICE

Nota - Eu assumi que cat seria a melhor maneira de fazer isso, mas estou realmente bem com a resposta usando outro utilitário como awk , sed , egrep , etc.

    
por cwd 07.12.2011 / 06:21

12 respostas

27

Você pode usar:

sed -e '/^;/d' php.ini
    
por 07.12.2011 / 07:06
22

Você não precisa canalizar um arquivo através do grep, grep pega nome (s) como argumentos da linha de comando.

grep -v '^#' file1 file2 file3

imprime todas as linhas, EXCETO aquelas que começam com # char. você pode mudar o caractere de comentário para o que você quiser.

Se você tem mais de um comentário, o char (assumindo que é no começo de uma linha)

egrep -v '^(;|#|//)' filelist
    
por 07.12.2011 / 22:26
9

egrep pode poupar o uso de cat . Em outras palavras, crie menos processos ( egrep vs cat + egrep ) e use menos buffers (canos de cat para egrep vs no pipe).

Geralmente, é uma boa ideia limitar o uso de cat se você simplesmente quiser passar um arquivo para um comando que possa lê-lo sozinho.

Com isto dito, o comando a seguir removerá os comentários, mesmo que sejam recuados por espaços ou guias:

egrep -v '^[[:blank:]]*;' file.ini
    
por 08.12.2011 / 00:20
6
egrep -v '^;|^$' $file

que excluirá linhas que começam com ';' e linhas vazias.

na regex, ^ indica o início de uma linha e $ no final de uma linha, portanto ^$ especifica linhas nas quais o caractere de início de linha e o caractere de fim de linha estão próximos uns dos outros .

    
por 07.12.2011 / 06:25
2

Um simples awk one-liner awk '/^;/{next}1' input_file deve fazer o truque.

[jaypal:~/Temp] cat file
;   - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - Show all errors except for notices
;
error_reporting  =  E_ALL & ~E_NOTICE

[jaypal:~/Temp] awk '/^;/{next}1' file
error_reporting  =  E_ALL & ~E_NOTICE
[jaypal:~/Temp] 
    
por 07.12.2011 / 08:31
2

Assim como o Jaypal, eu também provavelmente usaria awk para esses propósitos. É pior mencionar que o perl às vezes é bastante útil para tais propósitos:

cat data.txt | perl -lne "print unless /^;/"

As regexps do Perl são mais poderosas se comparadas às do awk e às vezes você pode precisar delas.

    
por 07.12.2011 / 16:27
2

Uma elaboração sobre a resposta do @ shabunc, isso usa o Perl para remover comentários (incluindo comentários em linha), e então imprime qualquer linha que contenha algo diferente do espaço em branco.

$ perl -ne 's/;.*//; print if /\S/' data.txt

Explicação:

  • s/;.*// usa o operador de substituição ( s/<regex>/<replacement>/ ) para substituir instâncias de ponto-e-vírgula e tudo seguindo-o em uma linha com a cadeia vazia.
  • print if /\S/ imprime a linha se corresponder à regexp \S , que é uma classe de caractere que corresponde a todos os caracteres que não são espaços em branco.
por 08.12.2011 / 05:06
1

Aqui está uma que eu uso, apenas substitua ';' com o caractere de comentário (por exemplo, '#' para muitos arquivos de configuração de serviço do UNIX):

grep -Ev '^[[:space:]]*;|^$' chan_dahdi.conf.sample | sed 's/;.*$//'

Isso elimina todos os comentários de linha inteira (mesmo que tenham espaço em branco na liderança) e quaisquer comentários que terminem com as linhas que não são de comentário, e também remove sucintamente as linhas em branco da saída. Isso pode ser possível sem o pipeline (meu sed ou awk-fu, reconhecidamente, não é ótimo), mas é muito fácil para mim entender (e lembrar), eu pensei em postar aqui.

    
por 08.12.2012 / 11:46
1

Exemplo mostra apenas linhas + não mostra novas linhas ou linhas vazias:

$ egrep -v '^(;|#|//)' /etc/ssh/sshd_config | tr '\n' ' '

 Protocol 2    SyslogFacility AUTHPRIV      PasswordAuthentication yes  ChallengeResponseAuthentication no   GSSAPIAuthentication yes GSSAPICleanupCredentials yes  UsePAM yes  AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS  X11Forwarding yes   Subsystem sftp    /usr/libexec/openssh/sftp-server 

OR

$ egrep -v '^(;|#|//|$)' /etc/ssh/sshd_config    

Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding yes
Subsystem   sftp    /usr/libexec/openssh/sftp-server
    
por 19.12.2013 / 11:26
0
egrep -v ^'(#|$)' file.txt

Remove todos os comentários e linhas vazias do arquivo.txt

    
por 26.07.2014 / 22:51
0

Tira também as linhas vazias

grep -E -v "^\s*($|;)" php.ini
    
por 23.10.2014 / 16:55
0

você pode usar o seguinte comando para salvar as linhas, excluindo as linhas e linhas vazias que começam com # em um novo arquivo

cat <file to be read> | egrep -v '^#|^$' > <file to be written at>

    
por 10.04.2016 / 19:01