Você pode usar:
sed -e '/^;/d' php.ini
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.
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
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
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 .
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]
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.
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. 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.
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
egrep -v ^'(#|$)' file.txt
Remove todos os comentários e linhas vazias do arquivo.txt
Tira também as linhas vazias
grep -E -v "^\s*($|;)" php.ini
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>
Tags command-line grep cat linux replace