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
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!
Isso pode funcionar para você:
sed '1b;/^country\t/d' in.txt > out.txt
ou
sed '1!{/^country\t/d}' in.txt > out.txt
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).
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.
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.
Tags sed