Como mencionado nos comentários acima, o formato do 'comentário' no seu caso de uso faz a diferença. Ainda assim, para vários casos, isso pode ser suficiente, sem ter que criar um script.
A solução:
A leitura da pergunta sugere que você está usando grep
para pesquisar os arquivos de qualquer maneira, então canalize isso por meio de outro grep
; assim:
grep your_pattern your_file | grep --perl-regexp --invert-match '(?:^;)|(?:^\s*/\*.*\*/)|(?:^\s*#|//|\*)'
O que não está preso:
Isso ainda permitirá linhas ou que tenham um caractere "acionador" em outro ponto da linha, que tenham comentários no final, como em echo "Hello World" # another comment
ou que façam parte de um comentário em várias linhas (exceto conforme observado no explicação abaixo.
Se isso for usado como pós-filtro para o grep, essas limitações devem ser insignificantes, já que a maioria dos comentários ainda serão filtrados e você não se preocupará mais "com os olhos vidrados".
A Explicação:
Existem três padrões, que você pode modificar para se adequar ao seu caso de uso, se necessário. O primeiro (?:^;)
captura as linhas que começam com o caractere ;
. Deve ser o primeiro, sem espaço em branco. O segundo catches lines that begin with the '/* ... */' comment style, with or without leading white space. The third
captura linhas, com ou sem espaço em branco inicial, que começam com #
, //
ou *
. O *
no último padrão ajuda a capturar a linha dentro de um comentário de várias linhas no estilo /* ... */
, em que o estilo comum deve executar uma coluna de *
para conectar a primeira e a última linha juntas. Por exemplo:
/************
*
* This is my
* multi-line
* comment.
*
************/
A notação (? ... )
em torno de cada padrão os torna padrões de 'não captura', com a esperança de aumentar a velocidade e reduzir o consumo de recursos. Os argumentos -Pv
para o grep dizem para usar regras de expressão regular Perl --perl-regexp
que permite o agrupamento sem captura e permite que o operador de alternância |
funcione, nenhum dos quais funciona no CLP grep. A página man grep avisa que a opção -P é experimental, por isso teste antes de confiar no seu sistema. O --invert-match
informa grep
para reverter a correspondência, retornando linhas que falham no padrão. Estes podem ser combinados e encurtados para -vP
.
O motivo para usar isso como um pós-filtro para seu grep
é triplo. Primeiro, você pode fazer o seu grepping normal e adicionar apenas o trabalho extra de usar isso quando tiver problemas com muitos comentários na saída. (Menos digitação e menos recursos usados.) Segundo, você provavelmente já desenvolveu os padrões que você costuma usar, e os hábitos que os acompanham, adicionando mais complexidade a eles, podem quebrá-los. Adicionar mais trabalho para depurar padrões quando não é necessário é um trabalho perdido. Terceiro, Ele não combina bem com comentários de várias linhas, mas se você já tiver usado o arquivo para o que deseja, ele removerá a maioria, se não todos, os comentários dos resultados e atenderá a sua finalidade. .