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.txt
recebo 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 hold
espaç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 t
ou b
, deixando o bsd sed feliz.