Excluindo linhas comentadas em um arquivo de texto usando sed

4

Eu sou um novato sed . Gostaria de usar sed para excluir linhas comentadas em um arquivo de texto.

Na minha série de arquivos de texto, as linhas comentadas começam com o símbolo # ou o símbolo @ (ou seja, são arquivos originalmente destinados a plotagem em código%). Suponha que eu tenha o seguinte arquivo de amostra (chamado xmgrace ):

# Comment 1
# Another comment
# Yet another comment
@ More comments
@ Still more comments
data1
data2

data3

Eu gostaria de usar sample.txt para modificar sed , no lugar, para obter o seguinte:

data1
data2

data3

onde há uma linha em branco entre " sample.txt " e " data2 " nas duas versões de data3 .

Com inspiração em esta pergunta sobre estouro de pilha , Eu criei esta série de comandos (consecutivos):

sed -i 's/#.*$//' sample.txt
sed -i 's/@.*$//' sample.txt

que fornecem este arquivo resultante:

    <blank line>
    <blank line>
    <blank line>
    <blank line>
    <blank line>
data1
data2

data3

onde sample.txt é apenas uma linha em branco. (Eu tive que escrever dessa maneira para que o Stack Exchange formatasse a saída corretamente.)

O problema acima é que as linhas comentadas são substituídas apenas por linhas em branco, não excluídas completamente.

Outra possibilidade de comandos (consecutivos) é:

sed -i 's/#.*$//' sample.txt
sed -i 's/@.*$//' sample.txt
sed -i '/^$/d' sample.txt

do qual obtenho a seguinte saída:

data1
data2
data3

O acima, no entanto, também está errado porque a linha em branco entre " <blank line> " e " data2 " não foi preservada (estou incorretamente excluindo todas as linhas em branco, indiscriminadamente). Como faço para excluir as linhas comentadas?

Estou executando o Ubuntu Linux. Obrigado pelo seu tempo!

    
por Andrew 01.07.2013 / 22:31

2 respostas

10

Use o comando sed delete (aqui assumindo o GNU sed como encontrado no Ubuntu e outros sistemas GNU).

 sed -i '/^[@#]/ d' sample.txt

Se você precisar levar em consideração os principais caracteres de espaço:

sed -i '/^\s*[@#]/ d' sample.txt
    
por 01.07.2013 / 22:44
1
grep '^[^@#]' < file.in > file.out

você obterá as linhas que começam com qualquer caractere, mas @ e # removerão com eficiência as linhas #foo , @foo , mas também as linhas vazias.

grep -v '^[@#]' < file.in > file.out

preservaria as linhas vazias. Se você quiser considerar linhas que tenham espaços em branco antes do @ , # :

grep -v '^[[:blank:]]*[@#]' < file.in > file.out

E também para remover linhas em branco:

grep '^[[:blank:]]*[^[:blank:]@#]' < file.in > file.out
    
por 31.08.2017 / 14:52