Aqui está uma abordagem sed
:
$ sed -nE '1s/.{11}(.{8}).*//p; 3s/.{3}(.{4}).*//p' file
Ethernet
t6 a
Explicação
O -n
suprime a saída normal (o normal é imprimir todas as linhas de entrada) para que seja impresso somente quando for solicitado. O -E
ativa expressões regulares estendidas.
O script sed
tem dois comandos, ambos usando o operador de substituição ( s/original/replacement/
). O 1s/.{11}(.{8}).*//p
será executado somente na primeira linha (é o que o 1s
faz) e corresponderá aos 11 primeiros caracteres da linha ( .{11}
), então captura os próximos 8 ( (.{8})
, os parênteses são um "grupo de captura") e depois todo o restante até o final da linha ( .*
). Tudo isso é substituído pelo que estava no grupo de captura ( ; se houvesse um segundo grupo de captura, seria
etc.). Finalmente, o
p
no final ( s/foo/bar/p
) faz com que a linha seja impressa após a substituição ter sido feita. Isso resulta em apenas os 8 caracteres de destino sendo emitidos.
O segundo comando é a mesma idéia geral, exceto que ele será executado somente na terceira linha ( 3s
) e manterá os 4 caracteres a partir do quarto.
Você também pode fazer a mesma coisa com perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*//}
elsif($.==3){s/.{3}(.{4}).*//}
else{next}; print; ' file
Ethernet
t6 a
Explicação
O -ne
significa "leia o arquivo de entrada linha a linha e aplique o script dado por -e
a cada linha. O script tem a mesma idéia básica de antes. A variável $.
contém o número da linha atual Verificamos se o número da linha é 1
ou 3
e, se for o caso, executamos a substituição, senão pulamos, portanto a print
será executada apenas para essas duas linhas, pois todas as outras serão ignoradas.
Claro, isso é Perl, então TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Explicação
Aqui, o -a
significa "dividir cada linha de entrada no caractere dado por -F
e salvar como a matriz @F
. Como o caractere fornecido está vazio, isso salvará cada caractere da linha de entrada como um caractere elemento em @F
. Em seguida, imprimimos os elementos 11-19 (os arrays começam a contar em 0
) para a 1ª linha e 3-7 para a 3ª.