Oto sed
podejście:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
Wyjaśnienie
-n
Wyjście normalne Pomija (normalne jest, aby wydrukować każdą linię wejściowego), tak, że tylko drukuje, gdy kazano. -E
Umożliwia rozszerzonych wyrażeń regularnych.
sed
Skrypt ma dwa polecenia, zarówno za pomocą operatora podstawienia ( s/original/replacement/
). 1s/.{11}(.{8}).*/\1/p
Będzie działać tylko na 1 linię (to właśnie 1s
robi), i będzie pasował do 1. 11 znaków w wierszu ( .{11}
), to rejestruje kolejne 8 ((.{8})
, nawiasy są „grupa capture”), a następnie wszystko inne, aż koniec linii ( .*
). Wszystko to zostaje zastąpione tym, co było w grupie przechwytywania ( \1
; gdyby istniała druga grupa przechwytywania, byłoby to \2
itd.). Wreszcie, p
na końcu ( s/foo/bar/p
) powoduje wydrukowanie wiersza po dokonaniu podstawienia. Powoduje to, że wyprowadzane są tylko docelowe 8 znaków.
Drugie polecenie to ten sam ogólny pomysł, z tą różnicą, że będzie działało tylko na 3. linii ( 3s
) i zachowa 4 znaki począwszy od 4. linii.
Możesz także zrobić to samo perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
Wyjaśnienie
Te -ne
środki „czytać wiersz pliku wejściowego po linii i zastosować skrypt podany przez -e
do każdej linii. Scenariusz jest taki sam podstawowy pomysł, jak wcześniej. Na $.
zmienna posiada aktualny numer wiersza więc sprawdzić, czy numer linii jest albo 1
czy 3
, a jeśli więc uruchom podstawienie, w przeciwnym razie pomiń. Dlategoprint
będzie uruchamiany tylko dla tych dwóch linii, ponieważ wszystkie inne zostaną pominięte.
Oczywiście jest to Perl, więc TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Wyjaśnienie
-a
Oznacza to, że „podziel każdą linię wejściową na znak podany przez -F
i zapisz jako tablicę @F
. Ponieważ podany znak jest pusty, spowoduje to zapisanie każdego znaku linii wejściowej jako elementu @F
. Następnie drukujemy elementy 11–19 ( tablice zaczynają się liczyć od 0
) dla 1. linii i 3-7 dla 3. linii.