Um in einer vorhandenen Textdatei auf dem Mac Text an einer bestimmten Zeile einzufügen, verwende eine Shell-Aktion in Kurzbefehle, um eine bearbeitete Kopie zu erstellen, prüfe sie und benenne sie anschließend im Finder um. In dieser Anleitung wird anhand eines entbehrlichen Beispiels eine Zeile vor Zeile 3 eingefügt.
Hier geht es darum, eine Zeile zu einer kleinen lokalen Klartextdatei hinzuzufügen und dabei die Reihenfolge der übrigen Zeilen beizubehalten. Du erstellst einen Finder-Kurzbefehl, der genau eine Datei annimmt. Einfügetext und Zeilennummer stehen im Skript, sodass sich dieselbe Änderung an entbehrlichen Kopien leicht wiederholen lässt.
Was bedeutet „in Zeile 3 einfügen“?
In diesem Artikel bedeutet Einfügen, neuen Text vor der vorhandenen nummerierten Zeile zu platzieren. Werden bei drei ursprünglichen Zeilen Birch vor Zeile 3 eingefügt, entstehen vier Zeilen:
| Position | Ursprüngliche Datei | Bearbeitete Datei |
|---|---|---|
| 1 | Cedar | Cedar |
| 2 | Maple | Maple |
| 3 | Willow | Birch |
| 4 | — | Willow |
Eine Zeile ist ein durch einen Zeilenumbruch begrenzter Datensatz, keine Zeile, die durch den visuellen Zeilenumbruch in einem Editor entsteht. Leerzeilen zählen mit. Das Beispiel verwendet gewöhnlichen UTF-8-Klartext mit LF-Zeilenenden und einem Zeilenumbruch nach der letzten Zeile. Verwende für diese Übung dieselben Bedingungen. Für Rich-Text-Dokumente und Dateien mit anderen Kodierungen oder Zeilenenden ist eine andere Vorgehensweise erforderlich.
Der Befehl, der die Änderung vornimmt, ist macOS sed. Seine numerischen Adressen zählen Zeilen ab 1, und sein Befehl i fügt Text vor der adressierten Zeile ein. Normalerweise schreibt er den umgewandelten Inhalt in die Standardausgabe. Dank dieser dokumentierten Eigenschaften kann der Kurzbefehl eine separate Ergebnisdatei erstellen. sed-Handbuch von Apple Distributions
Eine entbehrliche Textdatei erstellen
Öffne Terminal und füge den vollständigen Einrichtungsblock ein. Er erstellt auf deinem Schreibtisch einen Ordner namens Line Insert Demo und darin eine dreizeilige Datei namens notes.txt. Wenn dieser Ordnername bereits vorhanden ist, wird die Einrichtung abgebrochen. Wähle einen neuen Ordnernamen, bevor du es erneut versuchst.
/bin/sh <<'SH'
set -e
demo_dir="$HOME/Desktop/Line Insert Demo"
/bin/mkdir "$demo_dir"
printf '%s\n' 'Cedar' 'Maple' 'Willow' > "$demo_dir/notes.txt"
printf 'Created: %s\n' "$demo_dir/notes.txt"
SH
Beim Erstellen des Ordners wird absichtlich die Option weggelassen, die ein bereits vorhandenes Verzeichnis zulässt. Die Datei wird erst geschrieben, nachdem ein neuer Ordner erstellt wurde. So überschreibt die Einrichtung kein früheres Beispiel. Apples Shell-Dokumentation erläutert, wie sich mit printf und Ausgabenumleitung Textdateien erstellen lassen. Shell-Ein- und -Ausgabe
Führe diese Übung ausschließlich in diesem entbehrlichen Ordner durch. Öffne im Finder deinen Schreibtisch und suche den Ordner Line Insert Demo. Nach dem Erstellen des Kurzbefehls wählst du darin die Datei notes.txt aus.
Einen Finder-Kurzbefehl mit dem richtigen Eingabetyp erstellen
Erstelle in Kurzbefehle einen Kurzbefehl namens Insert Birch Before Line 3. Apple beschreibt, wie du über die Schaltfläche „Hinzufügen“ in der Symbolleiste einen Kurzbefehl erstellst, ihm einen Namen gibst und über die Seitenleiste Aktionen hinzufügst. Einen eigenen Kurzbefehl auf dem Mac erstellen
Richte ihn wie folgt ein:
- Öffne
Detailsdes Kurzbefehls und aktiviereAls Schnellaktion verwenden. Wähle dabeiFinderaus. - Ändere im Eingabebereich des Kurzbefehls den akzeptierten Inhalt in
Dateienund deaktiviere die anderen Typen. - Füge die Aktion
Shell-Skript ausführenhinzu. - Stelle
Shellauf/bin/sh,EingabeaufKurzbefehlseingabeundEingabe übergebenaufals Argumenteein. - Ersetze das Beispielskript der Aktion durch das vollständige Programm im nächsten Abschnitt.
Apple beschreibt, wie Finder-Kurzbefehle aktiviert und die akzeptierten Eingabetypen eingeschränkt werden. Der Typ Dateien umfasst viele Arten von Dokumenten. Mit dieser Einstellung stehen Dateien dem Kurzbefehl zur Verfügung; ihr Textformat wird dadurch nicht geprüft. Das Skript führt engere Prüfungen durch. Einen Kurzbefehl verwenden, während du am Mac arbeitest, Die Eingabe eines Kurzbefehls einschränken, Eingabetypen verstehen
Die Eingabekette ist entscheidend: Der Finder übergibt Kurzbefehle eine Datei, und die Shell-Aktion übergibt deren Pfad als Argument, das im Skript als $1 verfügbar ist. Füge vor der Shell-Aktion keine Aktion zum Lesen von Text ein: Dieses Programm benötigt den Dateipfad, damit es die vorhandene Datei lesen und einen benachbarten Namen für die Ausgabedatei auswählen kann.
Apple bestätigt, dass Kurzbefehle für den Mac Shell-Skripte direkt im Editor ausführen kann. Wenn Skripte deaktiviert sind, wähle Kurzbefehle > Einstellungen, öffne Erweitert und aktiviere Skriptausführung erlauben. Kurzbefehle für macOS kennenlernen, Erweiterte Einstellungen von Kurzbefehle
Die Zeile einfügen und ein separates Ergebnis erstellen
Füge das gesamte Programm in Shell-Skript ausführen ein. Es benötigt genau eine vorhandene reguläre Datei, fügt Birch vor Zeile 3 ein und schreibt eine benachbarte Datei, deren Name durch Anhängen von .inserted.txt an den Quellpfad entsteht.
#!/bin/sh
set -eu
fail() {
printf '%s\n' "$1" >&2
exit 1
}
[ "$#" -eq 1 ] || fail 'Select exactly one example text file.'
file=$1
line=3
case "$file" in
/*) ;;
*) fail 'The input must be an absolute file path.' ;;
esac
[ -f "$file" ] || fail 'The input file does not exist or is not a regular file.'
[ ! -L "$file" ] || fail 'Select the example file itself, not a symbolic link.'
[ -r "$file" ] || fail 'The input file cannot be read.'
count=$(/usr/bin/sed -n '$=' "$file") || fail 'Could not count the input lines.'
[ -n "$count" ] || fail 'The input file is empty.'
[ "$line" -le "$count" ] || fail 'The insertion line is beyond the end of the file.'
output="${file}.inserted.txt"
if [ -e "$output" ] || [ -L "$output" ]; then
fail 'The output name already exists. Inspect or rename that result first.'
fi
if (
set -C
/usr/bin/sed "${line}i\\
Birch
" "$file" > "$output"
); then
printf 'Created edited copy: %s\n' "$output"
else
fail 'Could not finish the edited copy. Inspect any partial output before retrying.'
fi
Die Zeilenumbrüche innerhalb des Ausdrucks sed sind beabsichtigt. Lass den Backslash nach i, den folgenden Zeilenumbruch und den Einfügetext in einer eigenen Zeile stehen. Der Befehlsaufbau folgt Apples bereitgestelltem Handbuch. Er vermeidet eine kompakte Einfügeschreibweise, die aus einer anderen sed-Implementierung übernommen wurde. sed-Handbuch: Befehle und Einfügetext
Die umgebenden Prüfungen legen fest, wie das Skript vorgeht. Um Text vor einer nummerierten Zeile einzufügen, muss diese Zeile vorhanden sein. Deshalb weist das Programm eine leere Datei und eine Zielzeile hinter der letzten Zeile zurück. Es lehnt außerdem einen bereits vorhandenen Ausgabedateinamen ab. Der Shell-Modus „noclobber“ bietet eine weitere Prüfung beim Öffnen der Ausgabedatei.
Das Skript liest das Original und schreibt eine separate Datei. Schlägt das Schreiben fehl, bleibt das Original verfügbar, aber eine unvollständige Ausgabedatei kann zurückbleiben. Behandle einen Fehler als nicht abgeschlossenen Vorgang und prüfe diese Ausgabedatei, bevor du sie entfernst oder es erneut versuchst. Führe immer nur eine Instanz gleichzeitig aus und ändere die Quelldatei während des Vorgangs nicht.
Die Ausgabe der Aktion ist eine Textstatusmeldung mit einem Pfad, kein Dateiobjekt von Kurzbefehle. Die bearbeitete Datei wird durch die Umleitung des Skripts erstellt. Wenn du danach Datei sichern hinzufügst, wird die Ausgabe der Aktion gespeichert, statt die beabsichtigte Zeile einzufügen. Apple beschreibt Datei sichern als Aktion zur Dateiverwaltung und Freigabe; in der Dokumentation wird sie nicht als Editor für nummerierte Zeilen beschrieben. Informationen zu Teilen-Aktionen in Kurzbefehle auf dem Mac
Das Skript ausführen, das Ergebnis prüfen und den ursprünglichen Dateinamen beibehalten
Klicke im Finder bei gedrückter Control-Taste auf die entbehrliche Datei notes.txt und wähle Schnellaktionen und dann Insert Birch Before Line 3. Apple beschreibt diesen Startweg. Wenn der Kurzbefehl fehlt, prüfe, ob Finder in den Details aktiviert ist und ob unter den akzeptierten Eingaben Dateien enthalten ist. Einen Kurzbefehl verwenden, während du am Mac arbeitest
Nach erfolgreicher Ausführung enthält der Demo-Ordner sowohl notes.txt als auch notes.txt.inserted.txt. Öffne die zweite Datei und prüfe, ob ihr Inhalt genau so aussieht:
Cedar
Maple
Birch
Willow
Du kannst die Ausgabedatei auch mit diesem vollständigen Befehl im Terminal prüfen:
/bin/cat "$HOME/Desktop/Line Insert Demo/notes.txt.inserted.txt"
Um den bearbeiteten Inhalt unter dem ursprünglichen Pfad abzulegen, schließe die Beispieldokumente und benenne die Dateien im Finder in diesen zwei Schritten um. Prüfe zuerst, ob notes.original.txt noch nicht verwendet wird. Falls die Datei existiert, wähle einen anderen, noch freien Sicherungsnamen.
- Wähle
notes.txt, drückeReturn, benenne die Datei innotes.original.txtum und drücke erneutReturn. - Wähle
notes.txt.inserted.txt, drückeReturn, benenne die Datei innotes.txtum und drücke erneutReturn. - Öffne die neu benannte Datei
notes.txtund prüfe die vier Zeilen.
Apple beschreibt, dass du ein Objekt auswählst und zum Umbenennen Return drückst. Behalte in beiden Namen die abschließende .txt-Erweiterung bei. Wenn der Finder meldet, dass ein Name bereits vergeben ist, halte an und prüfe das vorhandene Objekt, bevor du einen noch freien Namen auswählst. Dateien, Ordner und Laufwerke auf dem Mac umbenennen
Am Ende liegt der bearbeitete Inhalt unter notes.txt und der ursprüngliche Inhalt unter notes.original.txt. Damit ändert sich, welche Datei den ursprünglichen Pfad belegt. Die Identität der ursprünglichen Datei bleibt dabei nicht erhalten. Auch die Übernahme von Finder-Tags, erweiterten Attributen oder anderen Metadaten ist nicht garantiert.
Die Einfügung ändern, ohne ihre Bedeutung zu verändern
Ändere für eine andere entbehrliche Datei line=3 in die Nummer einer vorhandenen Zeile und ersetze Birch durch eine einfache einzelne Textzeile. Lass die angezeigte Einfügesyntax unverändert. Der Beispieltext enthält absichtlich keine Anführungszeichen, Dollarzeichen, Backticks oder Backslashes. Für beliebigen Text ist zusätzliches Quoting für Shell und sed erforderlich.
Verwende vor dem Bearbeiten des Skripts diese Entscheidungstabelle:
| Gewünschte Änderung | Vorgehensweise |
|---|---|
| Text vor der ersten Zeile platzieren | Setze line=1 für eine nicht leere Beispieldatei. |
| Text vor eine andere vorhandene Zeile platzieren | Setze line auf die entsprechende positive Zeilennummer. |
| Text nach der letzten Zeile hinzufügen | Verwende einen separaten Anfügevorgang. Dieses Programm weist eine nicht vorhandene Zielzeile zurück. |
| Text in eine leere Datei einfügen | Erstelle den ursprünglichen Inhalt separat. Es gibt keine vorhandene Zeile, auf die du verweisen kannst. |
| Den Kurzbefehl zweimal ausführen | Prüfe zuerst die vorherige Ausgabedatei. Nach dem Ersetzen des Originals fügt ein weiterer Durchlauf den Text erneut ein. |
Bei dieser Aufgabe am Schreibtisch sind die wichtigen Kontrollpunkte die ausgewählte Datei, die Einfügeposition, das fertige Ergebnis und der abschließende Dateiname. Sobald das Beispiel mit vier Zeilen korrekt ist, kannst du mit derselben Abfolge eine weitere einfache Einfügung testen und den Ausgangstext behalten.
Quellen
- sed — Stream-Editor — Apple Open Source Distributions
- Shell-Ein- und -Ausgabe — Apple-Entwicklerdokumentationsarchiv
- Einen eigenen Kurzbefehl auf dem Mac erstellen — Apple Support
- Einen Kurzbefehl verwenden, während du am Mac arbeitest — Apple Support
- Die Eingabe eines Kurzbefehls bei Ausführung in einer anderen App auf dem Mac einschränken — Apple Support
- Eingabetypen in Kurzbefehle auf dem Mac verstehen — Apple Support
- Kurzbefehle für macOS kennenlernen — Apple Developer
- Erweiterte Datenschutz- und Sicherheitseinstellungen in Kurzbefehle auf dem Mac — Apple Support
- Informationen zu Teilen-Aktionen in Kurzbefehle auf dem Mac — Apple Support
- Dateien, Ordner und Laufwerke auf dem Mac umbenennen — Apple Support