Teil 1
d
Geben Sie einfach die 13. Zeile ein:
sed '13d' <file.txt
Ein allgemeiner Weg, um das oben Genannte zu ergänzen, ist:
sed '13!d' <file.txt
Teil 2
Weil es möglich ist:
sed -n ':a;${P;q};N;4,$D;ba' <file.txt
Beachten 4
Sie, dass dies eine Nummer mehr ist als die von Ihnen benötigte Nummer. Wenn Sie also die letzte bis zehnte Zeile wollten, wäre dies 11
.
Testen mit seq
:
$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$
Versuchte Erklärung
:a # define label a
${ # match the last line
P # print the first line of the pattern space
q # quit
}
N # match all lines: append the next line to the pattern
4,${ # match the range of lines 4 to the end of the file
D # delete the first line of the pattern space
}
ba # match all lines: jump back to label a
Glenn Jackmans wertvolle Ergänzung:
Das war "nur die N-te Zeile". Hier ist "alles ABER die N-te Zeile":
sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'
funktioniert mit GNU sed, die \n
Sequenz funktioniert möglicherweise nicht mit anderen seds.
Ich habe dies mit BSD sed (OSX) versucht und festgestellt, dass es in der obigen Form nicht ganz funktioniert hat. Die Probleme scheinen zu sein:
;
Das Trennen von Zeilen scheint im Allgemeinen zu funktionieren, funktioniert jedoch nach einer Beschriftung nicht
- BSD sed scheint
;
nach dem letzten Befehl in einer einzeiligen {}
Befehlsgruppe erforderlich zu sein , während GNU sed dies nicht tut
\n
kann im Allgemeinen innerhalb des regulären Ausdrucks verwendet werden, aber anscheinend nicht innerhalb eines []
Klammerausdrucks. Um Zeilenumbrüche auszuschließen, können wir [[:alnum:][:punct:][:graph:][:blank:]]
stattdessen so etwas wie verwenden, obwohl dies andere Zeichen (insbesondere andere Steuerzeichen) ausschließen kann.
Dies ist also ein Versuch einer plattformunabhängigeren Version:
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
Dies scheint unter OSX und Ubuntu zu funktionieren.
head
/tail
-Lösung viel langsamer ist als einesed
Lösung. Trotzdem danke.