Ich habe das:
sed -i '/^$/d' temp_spec.rb
Das entfernt leere Zeilen und funktioniert gut. Wie kann ich dies nur für die Zeilen 5-999 (oder idealerweise 5 bis zum Dateiende) tun?
Ich habe es versucht:
sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb
aber keiner hat funktioniert (keine Fehler).
Antworten:
Wenn Sie alle Leerzeilen ab Zeile 5 löschen und die Zeilen 1 bis 4 beibehalten möchten, können Sie verwenden
Das
{
ist der Gruppierungsoperator, daher bedeutet der erste Befehl5,${
"von Zeile 5 bis zum Ende von input ($
) die folgenden Befehle bis zum Abgleich ausführen}
". Den Befehlen zwischen{
und}
kann erneut Adressen vorangestellt werden. Der innere Befehl/^$/d
bedeutet also "Wenn zwischen Anfang (^
) und Ende ($
) der Zeile nichts steht , löschen Sie ihn". Sed-Befehle können durch getrennt werden;
. (Dies ist eine schlecht dokumentierte Funktion von sed. Sie wird von den meisten sed-Implementierungen unterstützt, ist jedoch nicht vollständig portierbar .) Wie von Hauke festgestellt, ist das;
After{
optional. der vorhergehende}
ist jedoch erforderlich.Wenn Sie alle Leerzeilen ab Zeile 5 und auch die Zeilen 1 bis 4 löschen möchten, ist dies einfacher:
quelle
;
.;
.Eine weitere Option mit awk:
quelle
Bearbeiten 1:
Ich soll das erklären, also ...
Das ist unnötig kompliziert. Ich wusste nicht, dass Adressbereiche innerhalb erlaubt sind
{}
. Also musste ich "leere Zeilen löschen" anders ausdrücken. Der Kernbefehl istt
der von sedif ... then
.T
wäre einfacher gewesen, ist aber nur für GNU sed verfügbar. Ich zitiere die Manpage:Ich missbrauche den berühmten
s
Befehl. Es soll nichts ersetzen, sondern nur prüfen, ob die Leitung leer ist. Es ersetzt also eine leere Zeile durch eine leere Zeile (könnte alles als Ersatz verwenden, da die Zeile sowieso gelöscht wird).Wenn
s
ein "Ersatz" durchgeführt wurde, ist die Zeile leer. In diesem Fall muss der Befehld
ausgeführt werden. Sonst ist nichts zu tun. Dat
im Falle einers
Aktion nicht gesprungen wird, muss der Verzweigungsbefehlb
zum Ende des Skripts springen.: label
sind Zweigziele. Wiegoto
damals in den dunklen Zeiten (als sed erfunden wurde ... te-hee).Eine andere Möglichkeit wäre,
s
alle nicht leeren Zeilen zu "ersetzen", was dens
komplizierteren, aber den Rest des Befehls einfacher macht:^..*$
bedeutet "nicht leere Zeile" und\1
bedeutet "den Inhalt der ersten Klammern".quelle