Apagar linhas com padrão de correspondência após a primeira linha com sed

2

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

A história de fundo é que eu tenho um diretório de arquivos delimitados por tabulação com cabeçalhos e concateno esses arquivos com cat . Eu gostaria de remover os cabeçalhos extras.

No Vim, eu poderia fazer algo como : 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!

    
por Richard Herron 05.06.2012 / 19:10

5 respostas

1

Não há um caminho direto, mas essa é uma solução alternativa:

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

Isso pode funcionar para você:

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

ou

sed '1!{/^country\t/d}' in.txt > out.txt
    
por 07.06.2012 / 01:51
0
sed 's/[^country]*//2' <old >new

Isso deve mudar todas as instâncias do país, exceto a primeira (se você tiver duas na primeira linha, apenas a primeira será preservada).

    
por 05.06.2012 / 19:29
0
sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

Isso excluirá todas as linhas correspondentes após a primeira linha correspondente. Comentário:

/pattern/ - match pattern

{x - if above is matched, swap pattern and hold buffer

;/pattern/!{x;h;b;} - now test the pattern buffer (it will now be empty on the FIRST match) and if does not ! already contain pattern then swap 'x' the pattern and hold buffer back again, then COPY the pattern buffer into the hold buffer 'h', and branch 'b' to the end of the script, and load the next line.

;x;d} - this bit only gets executed if the negated pattern match in the previous step fails - i.e. the pattern buffer matches your pattern. In this case, swap the hold and pattern buffer back again 'x', and delete 'd' the line.

    
por 21.05.2018 / 11:24
0

se o / pattern / não corresponder a uma linha vazia, usando "o espaço hold é 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 , fazendo com que o bsd seja feliz.

    
por 01.09.2018 / 18:39

Tags