Hier ist ein sed
Ansatz:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
Erläuterung
Das -n
unterdrückt die normale Ausgabe (normal ist das Drucken jeder Eingabezeile), so dass nur gedruckt wird, wenn Sie dazu aufgefordert werden. Das -E
ermöglicht erweiterte reguläre Ausdrücke.
Das sed
Skript verfügt über zwei Befehle, die beide den Substitutionsoperator ( s/original/replacement/
) verwenden. Das 1s/.{11}(.{8}).*/\1/p
wird nur in der 1. Zeile ausgeführt (das ist, was das 1s
tut) und wird mit den ersten 11 Zeichen der Zeile ( .{11}
) übereinstimmen , dann erfasst es die nächsten 8 ( (.{8})
die Klammern sind eine "Erfassungsgruppe") und dann alles andere bis das Ende der Zeile ( .*
). All dies wird durch das ersetzt, was sich in der Erfassungsgruppe befand ( \1
; wenn es eine zweite Erfassungsgruppe gäbe, wäre dies \2
usw.). Schließlich bewirkt das p
am Ende ( s/foo/bar/p
), dass die Zeile gedruckt wird, nachdem die Ersetzung vorgenommen wurde. Dies führt dazu, dass nur die Ziel-8-Zeichen ausgegeben werden.
Der zweite Befehl ist dieselbe allgemeine Idee, außer dass er nur in der 3. Zeile ( 3s
) ausgeführt wird und die 4 Zeichen ab der 4. Zeile beibehalten.
Sie könnten das Gleiche auch tun mit perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
Erläuterung
Das -ne
bedeutet "Lesen Sie die Eingabedatei zeilenweise und wenden Sie das von -e
jeder Zeile angegebene Skript an. Das Skript ist dieselbe Grundidee wie zuvor. Die $.
Variable enthält die aktuelle Zeilennummer, daher prüfen wir, ob die Zeilennummer entweder 1
oder 3
und ist, wenn Führen Sie also die Ersetzung aus, andernfalls überspringen Sie sie. Daher print
wird die nur für diese beiden Zeilen ausgeführt, da alle anderen übersprungen werden.
Das ist natürlich Perl, also TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Erläuterung
Hier -a
bedeutet das Mittel "jede Eingabezeile auf das durch angegebene Zeichen teilen -F
und als Array speichern @F
. Da das angegebene Zeichen leer ist, wird jedes Zeichen der Eingabezeile als Element in @F
gespeichert. Dann drucken wir die Elemente 11-19 ( Arrays beginnen bei 0
) für die 1. Zeile und 3-7 für die 3. Zeile zu zählen.