Exclua linhas com padrão correspondente após a primeira linha com sed

Exclua linhas com padrão correspondente após a primeira linha com sed

Gostaria de excluir todas as linhas que contenham um padrão após a primeira linha (o padrão é /^country\t/). eu posso deletartodoocorrência com sed '/^country\t/d' in.txt > out.txt, mas gostaria de manter a primeira ocorrência na primeira linha.

A história por trás é que eu tenho um diretório de arquivos delimitados por tabulações com cabeçalhos e concateno esses arquivos com cat. Eu gostaria de remover os cabeçalhos extras.

No Vim eu poderia fazer algo parecido : 2,$g/^country\t/d, mas não consigo descobrir a solução sed. Quando tento sed '2,$ /^country\t/d in.txt > out.txtrecebo o erro unknown command: /.

Obrigado!

Responder1

Não há uma maneira direta, mas esta é uma solução alternativa:

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt

Responder2

Isso pode funcionar para você:

sed '1b;/^country\t/d' in.txt > out.txt

ou

sed '1!{/^country\t/d}' in.txt > out.txt

Responder3

sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

Isso excluirá todas as linhas correspondentes APÓS a primeira linha correspondente. Comentário:

/padrão/- padrão de correspondência

{x- se o acima for compatível, troque o padrão e mantenha o buffer

;/padrão/!{x;h;b;}- agora teste o buffer padrão (agora estará vazio na PRIMEIRA partida) e se não estiver! já contém o padrão, troque 'x' o padrão e retenha o buffer novamente, depois COPIE o buffer de padrão no buffer de retenção 'h' e ramifique 'b' até o final do script e carregue a próxima linha.

;x;d}- este bit só é executado se a correspondência do padrão negado na etapa anterior falhar - ou seja, o buffer do padrão corresponde ao seu padrão. Neste caso, troque o buffer de retenção e padrão novamente 'x' e exclua 'd' da linha.

Responder4

se o /pattern/ não corresponder a uma linha vazia, use "o holdespaço é inicializado como linha vazia" para testar a primeira correspondência:

preserve a primeira linha:

sed '/pattern/ {x; /^$/!d; g;}' file

solte a primeira linha:

sed '/pattern/ x' file

edite apenas a primeira linha:

sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file

edite apenas a seguinte linha:

sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file

PS: $'\n'(não um ;) segue tou b, deixando o bsd sed feliz.

informação relacionada