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".