Die erste Zeile zu entfernen ist eine typische “kleine” Aufgabe, die trotzdem Ärger machen kann, wenn man sie in-place macht und zwischen macOS und Linux wechselt. Hier sind die robusten Varianten, ohne fragiles Verhalten oder unnötige Datenverluste.
Schritt 1: Nur ausgeben, ohne die Datei zu ändern
Wenn du die Datei nicht verändern willst, sondern nur den Inhalt ohne erste Zeile weiterpipen möchtest, ist sed sehr direkt:
sed '1d' file.txt
1d bedeutet: Zeile 1 löschen.
Eine Alternative ohne sed ist tail:
tail -n +2 file.txt
Das ist oft leichter zu merken: “ab Zeile 2 ausgeben”.
Schritt 2: Datei wirklich ändern, aber sicher
Viele greifen zu sed -i, aber genau da liegt der Haken: Das Verhalten von -i unterscheidet sich zwischen GNU sed (Linux) und BSD sed (macOS).
Die portable, sichere Methode ist: in eine temporäre Datei schreiben und dann ersetzen.
tmp="$(mktemp)"
sed '1d' file.txt > "$tmp" && mv "$tmp" file.txt
Das ist nicht die kürzeste Lösung, aber sie ist robust, verständlich und funktioniert überall.
Warnhinweis: Wenn du Dateirechte oder Ownership exakt erhalten musst, ist mv meist okay, aber je nach Umgebung kann ein Tool wie sponge (moreutils) oder eine gezielte Preserve-Strategie sinnvoll sein. Für typische Textfiles ist mv pragmatisch.
In-place mit sed: Linux vs macOS
Wenn du bewusst in-place arbeiten willst:
Linux (GNU sed):
sed -i '1d' file.txt
macOS (BSD sed) verlangt ein Argument für das Backup-Suffix. Für “kein Backup” gibst du ein leeres Suffix an:
sed -i '' '1d' file.txt
Wenn du ein Backup willst:
sed -i '.bak' '1d' file.txt
Damit entsteht zusätzlich file.txt.bak.
Ein kleines Bash Snippet, das macOS und Linux abdeckt
Dieses Muster erkennt das OS und wählt die passende sed -i Variante. Für viele Skripte ist das eine sinnvolle Balance zwischen “kurz” und “robust”.
#!/usr/bin/env bash
set -u
file="${1:-}"
if [[ -z "$file" || ! -f "$file" ]]; then
echo "Usage: $0 <file>" >&2
exit 1
fi
if [[ "$(uname -s)" == "Darwin" ]]; then
sed -i '' '1d' "$file"
else
sed -i '1d' "$file"
fi
Wenn du maximale Portabilität willst, bleib bei der temp-file Variante. Wenn du bewusst nur macOS und Linux targetest, ist sed -i mit OS-Branch oft okay.
Sonderfall: Datei mit nur einer Zeile
sed '1d' produziert dann eine leere Datei. Das ist meist genau das gewünschte Verhalten. Wenn du das nicht willst, musst du es vorher prüfen:
lines="$(wc -l < file.txt)"
if [[ "$lines" -gt 1 ]]; then
sed '1d' file.txt > out.txt
fi
Kurzfazit
Zum Entfernen der ersten Zeile reicht sed '1d' oder tail -n +2, wenn du nur outputten willst. Wenn du die Datei ändern willst, ist die temp-file Methode der robusteste Standard. sed -i ist bequem, aber auf macOS und Linux unterschiedlich, deshalb entweder bewusst OS-spezifisch oder mit Branching lösen.