Usando a extensão do intervalo de endereços do primeiro ~ passo do GNU sed:
sed -n '1~46p; 14~46p;' file
Portanto, analise um arquivo de texto e imprima a linha 1 e a linha 14 e, em seguida, não faça nada com as linhas 15-46 e imprima a linha 47 e a linha 60, etc. até o final do arquivo. Então, basicamente, a cada 46 linhas, imprima a 1ª e a 14ª linha repetidamente para cada 46 linhas até EOF
Usando a extensão do intervalo de endereços do primeiro ~ passo do GNU sed:
sed -n '1~46p; 14~46p;' file
Como você tem awk
em suas tags, fornecerei uma solução com awk
:
awk '(NR%46==1||NR%46==14){print}' file
Nenhum trabalho para POSIX sed
:
sed 'H;1h;$!d;x;y/\n#/#\n/;s/\(#[^#]*\)\{12\}#\([^#]*\)\([^#]*#\)\{33\}/###/g;s/\(.*\)##.*//;s/##/#/g;y/\n#/#\n/'
Embora eu considere absurdo usar o POSIX sed
para essa tarefa quando outras ferramentas são mais adequadas, adicionarei uma explicação, porque há elementos úteis aqui que você pode precisar em tarefas reais:
H;1h;$!d;x
é um padrão para coletar todo o arquivo no espaço padrão, o que geralmente é útil (com o GNU sed
, você pode substituí-lo usando a opção -z
). Você pode descobrir como isso funciona. y/\n#/#\n/
troca as novas linhas com outro char (neste caso, #
). Faça isso como uma solução alternativa antes e depois do processamento, se precisar de expressões como "todos os caracteres, exceto a nova linha". Novamente, você não precisa disso com o GNU sed
, já que [^\n]
é permitido lá. s
corresponde a 12 + 1 + 33 = 46 #
(anteriormente, newlines) e 45 [^#]*
, que são o conteúdo da linha. A cada primeira linha é intocada, 12 são removidos, 1 preservados como
e 33 removidos. Isso é feito globalmente. O material ##
é feito para remover as linhas finais.