Inilah sed
pendekatannya:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
Penjelasan
The -n
Menekan output normal (normal adalah untuk mencetak setiap baris input) sehingga hanya mencetak ketika diberitahu untuk. The -E
memungkinkan ekspresi reguler diperpanjang.
The sed
Script memiliki dua perintah, baik menggunakan operator substitusi ( s/original/replacement/
). Hanya 1s/.{11}(.{8}).*/\1/p
akan berjalan pada baris 1 (itulah yang 1s
dilakukan), dan akan cocok dengan 11 karakter 1 baris ( .{11}
), kemudian menangkap 8 berikutnya ( (.{8})
, tanda kurung adalah "grup tangkap") dan kemudian semuanya sampai akhir baris ( .*
). Semua ini diganti dengan apa pun yang ada di kelompok tangkap ( \1
; jika ada kelompok tangkap kedua, itu akan menjadi \2
dll.). Akhirnya, p
pada bagian akhir ( s/foo/bar/p
) menyebabkan garis untuk dicetak setelah substitusi dibuat. Ini menghasilkan hanya 8 karakter target yang dihasilkan.
Perintah kedua adalah ide umum yang sama kecuali bahwa itu hanya akan berjalan pada baris ke-3 ( 3s
) dan akan membuat 4 karakter dimulai dari ke-4.
Anda juga dapat melakukan hal yang sama dengan perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
Penjelasan
The -ne
berarti "membaca file baris masukan demi baris dan menerapkan script yang diberikan oleh -e
masing-masing baris. Script adalah ide dasar yang sama seperti sebelumnya. The $.
variabel memegang nomor baris saat ini sehingga kami memeriksa apakah nomor baris adalah baik 1
atau 3
dan, jika jadi, jalankan substitusi, lewati saja. Karena itu print
hanya akan dijalankan untuk dua baris karena semua yang lain akan dilewati.
Tentu saja, ini Perl, jadi TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Penjelasan
Di sini, -a
berarti "pisahkan setiap baris input pada karakter yang diberikan oleh -F
dan simpan sebagai array @F
. Karena karakter yang diberikan kosong, ini akan menyimpan setiap karakter dari garis input sebagai elemen @F
. Kemudian, kita mencetak elemen 11-19 ( array mulai menghitung pada 0
) untuk baris pertama dan 3-7 untuk baris ketiga.