sed -e '/^\/\//d' -e 's@\(.*\)[[:blank:]]\{1,\}//.*@@' your_file
Esse comando sed exclui as linhas que começam com um comentário e, para comentários embutidos, remove tudo, desde o espaço em branco que separa o código do comentário até o final da linha. É POSIX (sem extensões GNU usadas) e, de acordo com o exemplo original do OP e para facilitar a leitura, esta versão suporta apenas //
comentários (mais sobre isso abaixo).
Detalhes
Essa chamada sed
inclui dois comandos sed: um "excluir no padrão" e uma substituição.
O primeiro é /^\/\//d
. O padrão ^\/\/
corresponde a linhas que começam com duas barras (por exemplo, "// foo bar"). Essas linhas são excluídas e a próxima linha é inserida imediatamente (ou seja, a substituição é ignorada).
O padrão na substituição é \(.*\)[[:blank:]]\{1,\}//.*
. Nota: Estou usando @
como um delimitador para evitar que algum caractere escape que um delimitador /
exigiria.
-
\(
.. \)
- qualquer coisa correspondida está disponível como referência de volta
-
.*
- corresponde a 0 ou mais caracteres (nada além de nova linha); na seção de substituição, podemos nos referir ao que quer que seja correspondido aqui por causa dos \(
e \)
.
-
[[:blank:]]
- um caractere de espaço em branco
-
\{1,\}
- corresponde a uma ou mais das coisas que o precedem ( [[:blank:]]
neste caso)
-
//
- combina duas barras (ou seja, o começo de um comentário)
-
.*
- o mesmo que acima, exceto não disponível como referência anterior
A parte de substituição é apenas
, que diz para substituir o que quer que tenhamos correspondido com a primeira referência anterior, ou seja, a .*
que precedeu [[:blank:]]
.
Por isso, funciona exatamente como descrevi: para comentários incorporados, remova tudo, desde o espaço em branco que separa o código do comentário até o final da linha.
'#' Comentários
Com o GNU sed, adicionar manipulação de #
comentários é apenas uma questão de substituir //
pela alternância (#|//)
(ou se precisarmos de escapar \(#\|\/\/\)
). Para fazê-lo, o modo POSIX, no entanto, é muito mais detalhado porque a alternância não é suportada. Você poderia obviamente forçá-lo repetindo os comandos sed existentes com versões para #
. Melhor ainda, já existe uma resposta que mostra uma maneira mais clara de fazê-lo. De qualquer forma, não vou repetir uma solução aqui.
EDITAR:
Tendo revisitado isso depois de muito tempo eu percebo que a substituição é mais complicada do que precisa ser e, como apontado nos comentários, não pega certos casos de canto além (por exemplo, "algo // foo // bar" ..only "// bar" é removido).
Eu acredito que isso é tudo que precisamos ...
sed -e '/^\/\//d' -e 's@[[:blank:]]\{1,\}//.*@@' your_file
Ou seja, a parte de substituição diz "no primeiro espaço em branco que encontramos, removê-lo e tudo o que segue, deixando apenas qualquer texto anterior".