Como posso "posicionar" um arquivo e remover linhas comentadas?

29

Gostaria de saber se existe uma maneira de catarquivar php.inie remover todas as linhas começando com;

Por exemplo, se o arquivo contiver 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 executei o comando correto cat | {remove comments command}, e acabaria com:

error_reporting  =  E_ALL & ~E_NOTICE

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

cwd
fonte
Que tal algo assim error_reporting = E_ALL & E_NOTICE ; Show all errors, except for notices? O comentário também deve ser removido nesse caso?
um CVn
@ MichaelKjörling - Estou muito bem, com apenas as linhas começando com os comentários sendo removidos.
cwd
11
caté a ferramenta para concatenar arquivos. grepé a ferramenta para filtrar linhas com base em padrões. sede awktambém pode modificar essas linhas.
Stéphane Chazelas

Respostas:

31

Você pode usar:

sed -e '/^;/d' php.ini
favadi
fonte
25

Você não precisa canalizar um arquivo através do grep, o grep usa os nomes de arquivo como argumentos da linha de comando.

grep -v '^#' file1 file2 file3

imprimirá todas as linhas, EXCETO aquelas que começam com um # char. você pode alterar o caractere de comentário para o que desejar.

Se você tiver mais de um caractere de comentário (assumindo que está no início de uma linha)

egrep -v '^(;|#|//)' filelist
bsd
fonte
2
Outro que eu fiz que sempre ficou comigo foi grep '^[^;]' filename. Eu não posso falar sobre a sua portabilidade!
precisa
@JodieC, que é portátil, mas também remove linhas vazias (o que geralmente é desejado). O equivalente padrão de egrepé grep -E. Pode-se também usargrep -ve '^[;#]' -e '^//'
Stéphane Chazelas
9

egrepvocê pode economizar o uso de cat. Em outras palavras, menos criar processos ( egrepvs cat+ egrep) e utilizar menos tampões (tubo de cata egrepvs não tubo).

Geralmente, é uma boa idéia limitar o uso, catse você simplesmente deseja passar um arquivo para um comando que pode lê-lo por si mesmo.

Com isso dito, o seguinte comando removerá os comentários, mesmo que sejam recuados com espaços ou guias:

egrep -v '^ [[: blank:]] *;' file.ini
nrolans
fonte
Engraçado que você combine o formato regex da [[ classe de caracteres mais recente ]]com o uso do egrepcomando descontinuado por pelo menos uma década.
mikeserv
Interessante ... documentos atuais em gnu.org/software/grep/manual/html_node/… incluem classes POSIX.
Jack Wasey
7
egrep -v '^;|^$' $file

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

em regex, ^indica o início de uma linha e $o final de uma linha; portanto, ^$especifica as linhas nas quais o caractere de início da linha e o final da linha estão próximos um do outro.

Tim Kennedy
fonte
então, se estou lendo isso direito, isso pode remover linhas comentadas, mas também linhas em branco?
Cwd
11
@cwd Sim. Eu não sei por que ele incluiu ambos, mas se você só quer remover linhas comentadas apenas usaregrep -v '^;'
Michael Mrozek
4
egrep gosta arquivos também (menos processos e padrões usados), e um pequeno bônus seria para remover comentários recuados também:egrep -v '^[[:blank:]]*;' file.ini
nrolans
10
Precisamos de um crachá de "uso inútil de gato".
Simon Richter
@ nrolans - parece um comentário popular, por que não torná-lo uma resposta?
Cwd
2

Um simples awkone-liner awk '/^;/{next}1' input_filedeve 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] 
jaypal singh
fonte
3
Correto, mas detalhado. Apenas awk '!/^;/' input_fileé suficiente.
manatwork
2

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

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

Os regexps Perl são mais poderosos em comparação com o awk e, às vezes, você pode precisar deles.

shabunc
fonte
+1 para perl, embora o gato e o -l sejam ambos redundantes, portanto, uma invocação mais simples éperl -ne 'print unless /^;/' data.txt
Simon Whitaker
@ Simone Whitaker, sim, você está certo - é apenas um hábito escrever da maneira que escrevo, e vale a pena mencionar.
shabunc
11
Coisa certa. De fato, acho que catfunciona bem nesses exemplos se você o considerar como um proxy para o mais genérico "qualquer coisa que gere texto no STDOUT". Tubos Unix são a melhor coisa desde pão fatiado, imho. :)
Simon Whitaker
2

Uma elaboração da resposta do @ shabunc, usa o Perl para remover os comentários (incluindo comentários embutidos) e depois imprimir todas as linhas que contenham algo que não seja 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 um ponto-e-vírgula e tudo o que segue em uma linha pela sequência vazia.
  • print if /\S/imprime a linha se corresponder ao regexp \S, que é uma classe de caracteres que corresponde a todos os caracteres que não são espaços em branco.
Simon Whitaker
fonte
1

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

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

Isso elimina todos os comentários de toda a linha (mesmo se eles tiverem espaços em branco à esquerda), e qualquer comentário que termine as linhas sem comentários, e remove sucintamente as linhas em branco da saída. Isso pode ser possível sem o pipeline (meu sed ou awk-fu não é reconhecidamente ótimo), mas é tão fácil para eu entender (e lembrar) que achei que o postaria aqui.

Trey Blancher
fonte
1

O 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 

OU

$ 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

fonte
2
O uso de egrepestá obsoleto. grep -Eé o comando que você está procurando aqui.
mikeserv
0
egrep -v ^'(#|$)' file.txt

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

Nikola
fonte
2
Você deve expandir sua resposta com um pouco mais de informação para os não iniciados (por exemplo, exatamente o que o regex que você usa).
HalosGhost
egrepé depreciado. Use em grep -Evvez disso.
Yokai
0

Também tira as linhas vazias

grep -E -v "^\s*($|;)" php.ini
Fedir RYKHTIK
fonte
0

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

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

KawaiKx
fonte
catPipe inútil e egrepé depreciado e deve ser substituído grep -Epor expressões estendidas ou apenas grep -v.
Yokai