sed replace: Effizientes Textmanipulationswerkzeug für Linux und Unix – wmpsites.com
  • Allgemein
  • sed replace: Effizientes Textmanipulationswerkzeug für Linux und Unix

sed replace: Effizientes Textmanipulationswerkzeug für Linux und Unix

Was ist sed replace?

Als Herzstück des Linux- und Unix-Betriebssystems bietet sed (Stream Editor) eine unvergleichliche Textmanipulationsumgebung. Die sed-Kommandozeile mit dem Flag "replace" ist ein mächtiges Werkzeug, das es dir ermöglicht, Textelemente gezielt zu finden und durch andere zu ersetzen.

Funktionen von sed replace

Mit sed replace kannst du:

  • Bestimmte Zeichenfolgen in Textdateien suchen und ersetzen
  • Übereinstimmende Muster mit benutzerdefiniertem Text ersetzen
  • Ersetzungen auf Zeilenebene durchführen, um bestimmte Zeilen zu transformieren
  • Globale Ersetzungen vornehmen, um alle Instanzen eines Musters im Text zu ersetzen
  • Reguläre Ausdrücke verwenden, um komplexe Suchanforderungen anzugeben
  • In mehreren Dateien gleichzeitig ersetzen, um eine effiziente Textmanipulation zu automatisieren
  • Befehlszeilenargumente nutzen, um Eingaben dynamisch zu verarbeiten
  • Durch Skripterstellung komplexe Ersetzungsoperationen automatisieren und wiederverwendbar machen

Diese vielseitigen Funktionen machen sed replace zu einem unverzichtbaren Werkzeug für Textautomatisierung, Datenbereinigung und die Erstellung von Konfigurationsdateien unter Linux und Unix.

Syntax von sed replace

Die Syntax von sed replace ist wie folgt:

sed 's/SUCHE/ERSATZ/FLAGGEN' DATEI(EN)

Parameter:

  • SUCHE ist das zu suchende Muster. Dies kann eine Zeichenfolge, ein regulärer Ausdruck oder eine Kombination aus beidem sein.
  • ERSATZ ist der Text, durch den das gefundene Muster ersetzt werden soll.
  • FLAGGEN sind optionale Modifikatoren, die das Ersetzungsverhalten steuern (siehe unten).
  • DATEI(EN) sind die zu bearbeitenden Dateien.

Flaggen

Globale Ersetzung:

  • g: Ersetzt alle Vorkommen des Musters in einer Zeile.

Zeilenbasierte Ersetzung:

  • n: Ersetzt nur das erste Vorkommen des Musters in einer Zeile.
  • N: Ersetzt alle Vorkommen des Musters in einer Zeile, aber nur in der angegebenen Zeilennummer N.

Musteranpassungsmodifikatoren:

  • i: Ignoriert beim Suchen die Groß-/Kleinschreibung.
  • x: Erweitert das angegebene Suchmuster zu einem regulären Ausdruck.

Ersetzungsmodifikatoren:

  • p: Druckt die geänderte Zeile aus.
  • w DATEI: Speichert die geänderten Zeilen in der angegebenen Datei.

Beispiel

Um beispielsweise alle Vorkommen des Wortes "Beispiel" in der Datei "text.txt" durch "Textbeispiel" zu ersetzen, würdest du Folgendes verwenden:

sed 's/Beispiel/Textbeispiel/g' text.txt

Verwendung von sed replace

sed replace ist ein vielseitiges Textmanipulationswerkzeug, mit dem du komplexe Textersetzungsoperationen auf der Kommandozeile durchführen kannst. Hier sind einige grundlegende Anweisungen zur Verwendung von sed replace:

Suchen und Ersetzen einer Zeichenfolge

Um eine bestimmte Zeichenfolge zu suchen und zu ersetzen, verwendest du folgende Syntax:

sed 's/Suchmuster/Ersatz/' datei.txt

Ersetze beispielsweise alle Vorkommen von "Linux" durch "Unix" in datei.txt:

sed 's/Linux/Unix/' datei.txt

Globale Ersetzung

Mit der Option -g kannst du die Ersetzung global vornehmen, sodass alle Vorkommen der Suchzeichenfolge ersetzt werden:

sed -g 's/Suchmuster/Ersatz/' datei.txt

Ersetzen auf Zeilenbasis

Um eine Ersetzung nur auf bestimmte Zeilen anzuwenden, kannst du die Optionen -n und -p verwenden. Mit -n unterdrückst du die Ausgabe von sed und mit -p gibst du die geänderten Zeilen aus:

sed -n 'Zeilenmuster; s/Suchmuster/Ersatz/' datei.txt

Ersetze beispielsweise alle Vorkommen von "Windows" durch "macOS" in Zeilen, die mit "Betriebssysteme" beginnen:

sed -n '/Betriebssysteme/ s/Windows/macOS/' datei.txt

Ersetzen mit regulären Ausdrücken

Reguläre Ausdrücke (regex) ermöglichen es dir, komplexe Suchmuster zu definieren. Setze reguläre Ausdrücke in Anführungszeichen:

sed 's/Suchmuster(regex)/Ersatz/' datei.txt

Ersetze beispielsweise alle durch Leerzeichen getrennten Wörter durch Unterstriche:

sed 's/\s+/_/' datei.txt

Ersetzen in mehreren Dateien

Mit der Option -f kannst du eine sed-Skriptdatei angeben, um Ersetzungen in mehreren Dateien gleichzeitig durchzuführen:

sed -f sed_skript.sed datei1.txt datei2.txt ...

Ersetzen mit Befehlszeilenargumenten

Du kannst Such- und Ersetzungsmuster auch als Befehlszeilenargumente angeben:

sed s/Suchmuster/Ersatz datei.txt

Ersetzen mit Skripten

Für komplexere Ersetzungsoperationen kannst du sed-Skripte schreiben. Diese enthalten eine Reihe von Anweisungen, die jeweils eine bestimmte Ersetzungsoperation ausführen.

Suchen und Ersetzen bestimmter Zeichenfolgen

Einfaches Suchen und Ersetzen

Mit sed replace kannst du ganz einfach bestimmte Zeichenfolgen in einem Text durch andere ersetzen. Die Syntax lautet wie folgt:

sed 's/Suchmuster/Ersatztext/g' datei

Dabei steht Suchmuster für die Zeichenfolge, die du ersetzen möchtest, und Ersatztext für die Zeichenfolge, durch die sie ersetzt werden soll. Die Option g weist sed an, alle Vorkommen des Suchmusters zu ersetzen.

Beispiel:

sed 's/Linux/Unix/g' datei

In diesem Beispiel wird jedes Vorkommen des Wortes "Linux" in der Datei "datei" durch das Wort "Unix" ersetzt.

Berücksichtigung von Groß-/Kleinschreibung

Standardmäßig unterscheidet sed replace nicht zwischen Groß- und Kleinschreibung. Wenn du Groß-/Kleinschreibung bei der Suche berücksichtigen möchtest, kannst du die Option \U oder \L verwenden:

  • \U: Das Suchmuster als Großbuchstaben behandeln
  • \L: Das Suchmuster als Kleinbuchstaben behandeln

Beispiel:

sed 's/\Ulinux/\LUNIX/g' datei

Dieses Beispiel ersetzt alle Vorkommen von "LINUX" in der Datei "datei" durch "unix".

Ganze Wörter ersetzen

Wenn du nur ganze Wörter ersetzen möchtest, kannst du die Wortgrenzen-Metazeichen \b verwenden. Dies stellt sicher, dass das Suchmuster nur ersetzt wird, wenn es ein eigenes Wort bildet.

Beispiel:

sed 's/\bLinux\b/\bUnix\b/g' datei

Dieses Beispiel ersetzt nur das Wort "Linux", nicht aber "Linuxen" oder "linuxen".

Anpassen von Suchen und Ersetzungen

Neben der einfachen Suche und dem Ersetzen kannst du auch reguläre Ausdrücke und andere Funktionen verwenden, um deine Suchen und Ersetzungen anzupassen. Weitere Informationen hierzu findest du in den Abschnitten "Ersetzen mit regulären Ausdrücken" und "Ersetzen mit benutzerdefinierten Texten".

Muster und Ersetzungen anpassen

Bei Verwendung von sed replace kannst du die zu suchenden Muster und die durchzuführenden Ersetzungen anpassen, um bestimmte Anforderungen zu erfüllen.

Anpassung der Muster

Du kannst das zu suchende Muster mit den folgenden Optionen anpassen:

  • Zeilenbegrenzer (): Suchmuster über mehrere Zeilen hinweg abgleichen.
  • Zeichenklassen ([:alnum:]): Suchmuster auf bestimmte Zeichenklassen beschränken, z. B. Buchstaben und Zahlen.
  • Reguläre Ausdrücke: Komplexe Suchmuster mit regulären Ausdrücken definieren.

Anpassung der Ersetzungen

Du kannst die durchgeführte Ersetzung mit den folgenden Optionen anpassen:

  • Groß-/Kleinschreibung: Ob die Groß-/Kleinschreibung von Suchausdrücken und Ersatztexten berücksichtigt werden soll.
  • Zeilenvorschubzeichen (\n): Zeilenvorschübe in die Ersetzung einfügen.
  • Tabulatorzeichen (\t): Tabulatorzeichen in die Ersetzung einfügen.
  • Ersetzung mit Variablen: Variablen in der Ersetzung verwenden, um dynamische Inhalte einzufügen.

Ersetzen mit Backreferences

Mit Backreferences kannst du Teile des Suchausdrucks in der Ersetzung wiederverwenden. Um auf das n-te abgeglichene Muster zu verweisen, verwende die Syntax \n.

Ersetzen mit bedingten Ausdrücken

Du kannst die Ersetzung mit bedingten Ausdrücken wie ? (wenn das Muster übereinstimmt) und : (sonst) steuern. Dies ermöglicht komplexe Ersetzungen basierend auf Übereinstimmungen und Bedingungen.

Ersetzen auf Zeilenbasis

Wenn du einen Text bearbeitest, kann es vorkommen, dass du bestimmte Zeichenfolgen in jeder Zeile ersetzen musst. sed bietet leistungsstarke Optionen, um diese zeilenbasierten Ersetzungen effizient durchzuführen.

Zeilenweise Ersetzen aller Vorkommen

Um alle Vorkommen einer Zeichenfolge in jeder Zeile zu ersetzen, verwende die folgende Syntax:

sed 's/alte_zeichenfolge/neue_zeichenfolge/g'

Beispiel:

sed 's/Linux/GNU\/Linux/g' eingabe.txt

Ergebnis:

GNU/Linux ist ein freies Betriebssystem.
GNU/Linux ist ein großartiges Betriebssystem.

Zeilenweise Ersetzen des ersten Vorkommens

Möchtest du nur das erste Vorkommen einer Zeichenfolge in jeder Zeile ersetzen, kannst du die globale Ersetzung (g) weglassen:

sed 's/alte_zeichenfolge/neue_zeichenfolge/'

Beispiel:

sed 's/ist/ist das/' eingabe.txt

Ergebnis:

Linux ist das ein freies Betriebssystem.
Linux ist das ein großartiges Betriebssystem.

Zeilenweise Ersetzen mit regulären Ausdrücken

Du kannst auch reguläre Ausdrücke verwenden, um komplexe Muster in jeder Zeile zu ersetzen:

sed 's/^\s+//'

Dieses Beispiel entfernt führende Leerzeichen von jeder Zeile:

Eingabetext mit führenden Leerzeichen
Nach dem Ersetzen mit sed

Weitere Möglichkeiten

sed bietet auch andere Optionen für zeilenbasierte Ersetzungen:

  • Ersetzen auf bestimmten Zeilen: Verwende die Zeilenadressen n oder n1,n2, um das Ersetzen auf bestimmte Zeilen zu beschränken.
  • Ersetzen mit einem Befehl: Verwende die Option -e oder -i, um ein Ersetzungsmuster mit einem externen Befehl zu kombinieren.

Mit diesen Optionen kannst du komplexe Textmanipulationen auf Zeilenbasis durchführen, um deine Texte zu optimieren und zu bereinigen.

Globale Ersetzung

Mit der globalen Ersetzung kannst du alle Vorkommen einer Zeichenfolge in deinem Text durch eine andere Zeichenfolge ersetzen. Dies ist nützlich, um konsistente Änderungen an großen Textmengen vorzunehmen.

Syntax

Um eine globale Ersetzung durchzuführen, verwende die folgende Syntax:

sed 's/Suchmuster/Ersetzungsmuster/g' eingabedatei > ausgabedatei

Beispiel:

Um alle Vorkommen des Wortes "Hund" durch "Katze" zu ersetzen, verwendest du folgenden Befehl:

sed 's/Hund/Katze/g' eingabedatei > ausgabedatei

Vorteile

  • Effizienz: Ersetzt alle Vorkommen einer Zeichenfolge in einem Schritt, wodurch Zeit und Mühe gespart werden.
  • Konsistenz: Gewährleistet, dass alle Vorkommen einer Zeichenfolge durch dieselbe Ersatzzeichenfolge ersetzt werden.
  • Automatisierung: Ermöglicht es dir, umfangreiche Textersetzungen zu automatisieren.

Beachte:

  • Das Flag g ist für die globale Ersetzung unerlässlich. Wenn du es weglässt, wird nur das erste Vorkommen der Zeichenfolge ersetzt.
  • Wenn die Ersatzzeichenfolge Sonderzeichen enthält, müssen diese mit einem umgekehrten Schrägstrich () maskiert werden.
  • Du kannst die Ersetzung auch innerhalb eines Skripts durchführen, was eine noch größere Automatisierung ermöglicht.

Ersetzen mit benutzerdefinierten Texten

Manchmal möchtest du bestimmten Text durch einen benutzerdefinierten Text ersetzen. Mit sed replace ist das ganz einfach.

Anpassbare Ersetzungen

Du kannst ein Zeichen, Wort oder einen Ausdruck durch einen beliebigen Text deiner Wahl ersetzen. Dafür verwendest du die Syntax:

sed 's/Suchen/Ersetzen/' Datei

Dabei sind "Suchen" und "Ersetzen" die Zeichenfolge, die du suchen und durch benutzerdefinierten Text ersetzen möchtest. Die Datei ist die Textdatei, in der du die Ersetzung durchführen möchtest.

Beispiel

Angenommen, du hast eine Textdatei namens "namen.txt" mit folgenden Inhalten:

John Doe
Jane Smith

Du möchtest nun alle Vorkommen von "Doe" und "Smith" durch "Mustermann" ersetzen. Dafür verwendest du folgenden Befehl:

sed 's/Doe/Mustermann/' namen.txt

Die Ausgabe wird wie folgt aussehen:

John Mustermann
Jane Mustermann

Weitere Optionen

Neben der einfachen Ersetzung kannst du auch zusätzliche Optionen verwenden, um die Suche und Ersetzung zu verfeinern:

  • globale Ersetzung (g): Ersetzt alle Vorkommen der gesuchten Zeichenfolge.
  • Zeilenbegrenzer (d): Trennt die ersetzte Zeichenfolge durch ein bestimmtes Zeichen (z. B. ein Komma).
  • Groß-/Kleinschreibung beachten (i): Berücksichtigt die Groß-/Kleinschreibung bei der Suche.
  • Dateinamen in Ersetzung einfügen (f): Fügt den Dateinamen in den ersetzten Text ein.

Diese Optionen kannst du beispielsweise verwenden, um alle Vorkommen von "John" in "namen.txt" durch den Dateinamen zu ersetzen:

sed 's/John/&f/' namen.txt

Die Ausgabe wird wie folgt aussehen:

namen.txt Doe
namen.txt Smith

Ersetzen mit regulären Ausdrücken

Neben dem einfachen Suchen und Ersetzen kannst du mit sed replace auch reguläre Ausdrücke verwenden, um komplexe Suchmuster anzugeben. Reguläre Ausdrücke ermöglichen es dir, Text anhand von Mustern zu finden und zu ersetzen, die nicht exakt mit bestimmten Zeichenfolgen übereinstimmen.

Verwenden von regulären Ausdrücken

Um einen regulären Ausdruck in sed replace zu verwenden, musst du ihn in Schrägstriche einschließen /. Beispielsweise sucht das folgende Kommando nach jeder Zeichenfolge, die mit dem Buchstaben "a" beginnt und mit dem Buchstaben "z" endet:

sed 's/\/az\/g' text.txt

Metazeichen

Reguläre Ausdrücke verwenden Metazeichen, um bestimmte Textmuster darzustellen. Hier sind einige gängige Metazeichen:

  • . : Passt zu jedem einzelnen Zeichen
  • * : Passt zu null oder mehreren Vorkommen des vorherigen Zeichens
  • + : Passt zu einem oder mehreren Vorkommen des vorherigen Zeichens
  • ? : Passt zu null oder einem Vorkommen des vorherigen Zeichens
  • ^ : Passt zum Anfang der Zeichenfolge
  • $ : Passt zum Ende der Zeichenfolge

Ersetzen mit regulären Ausdrücken

Das folgende Kommando ersetzt alle Vorkommen des Wortes "Hund" durch "Katze" in der Datei text.txt:

sed 's/Hund/Katze/g' text.txt

Gruppen und Backreferenzen

Du kannst reguläre Ausdrücke auch verwenden, um Gruppen von Zeichen zu erfassen und in deinem Ersatztext wiederzuverwenden. Gruppen werden in Klammern () eingeschlossen. Um auf eine Gruppe im Ersatztext zu verweisen, verwende die Backreferenz \n, wobei n die Nummer der Gruppe ist.

Das folgende Kommando sucht nach allen Vorkommen von E-Mail-Adressen und ersetzt den Benutzernamen durch "example":

sed 's/^([a-zA-Z0-9_\.]+)@.*$/example@\1/' email.txt

In diesem Beispiel ist [a-zA-Z0-9_\.]+ die Gruppe, die den Benutzernamen erfasst. \1 in der Ersetzung verweist auf die erfasste Gruppe und ersetzt den Benutzernamen durch "example".

Ersetzen in mehreren Dateien

sed replace bietet die praktische Möglichkeit, bestimmte Zeichenfolgen oder Muster in mehreren Dateien gleichzeitig zu ersetzen. Diese Funktion ist besonders nützlich, wenn du Änderungen an einer Vielzahl von Textdateien vornehmen musst, ohne sie einzeln öffnen und bearbeiten zu müssen.

Vorgehensweise

Um in mehreren Dateien zu ersetzen, verwendest du die Option -f zusammen mit einer Befehlsdatei. In dieser Befehlsdatei gibst du die sed-Befehle zum Suchen und Ersetzen an. Die Syntax lautet wie folgt:

sed -f befehlsdatei datei1 datei2 datei3 ...

Dabei ist befehlsdatei der Name der Datei, die die sed-Befehle enthält, und datei1, datei2, datei3 … sind die Dateien, in denen du die Ersetzungen vornehmen möchtest.

Befehlsdatei

Die Befehlsdatei ist eine einfache Textdatei, die die sed-Befehle enthält, die du ausführen möchtest. Jeder Befehl sollte in einer eigenen Zeile stehen. Beispielsweise kannst du die folgende Befehlsdatei erstellen, um die Zeichenfolge "alt" durch "neu" in mehreren Dateien zu ersetzen:

# Befehlsdatei
s/alt/neu/g

Ausführung

Um die Ersetzungen auszuführen, navigierst du in das Verzeichnis, das die zu bearbeitenden Dateien enthält, und gibst den folgenden Befehl ein:

sed -f befehlsdatei datei1 datei2 datei3 ...

sed durchläuft jede Datei der Reihe nach und führt die in der Befehlsdatei angegebenen Ersetzungen durch. Die geänderten Dateien werden an Ort und Stelle überschrieben.

Tipps

  • Stelle sicher, dass du über die Berechtigung verfügst, die Dateien zu bearbeiten, in denen du die Ersetzungen vornimmst.
  • Verwende die Option -n, um sed daran zu hindern, die geänderten Zeilen auszugeben.
  • Verwende die Option -i, um die geänderten Dateien an Ort und Stelle zu überschreiben.

Ersetzen mit Befehlszeilenargumenten

Wenn du noch mehr Kontrolle über deine Ersetzungen haben möchtest, kannst du Befehlszeilenargumente verwenden. Diese bieten dir die Möglichkeit, die zu suchende Zeichenfolge und den Ersatz direkt von der Kommandozeile aus anzugeben. Die Syntax hierfür lautet:

sed "s/SUCHE/ERSATZ/g" EINGABEDATEI

Beispielsweise kannst du alle Vorkommen von "Linux" durch "Unix" in der Datei "text.txt" ersetzen, indem du folgenden Befehl ausführst:

sed "s/Linux/Unix/g" text.txt

Vorteile von Befehlszeilenargumenten

  • Flexibilität: Du kannst die zu suchende Zeichenfolge und den Ersatz bei jedem Aufruf von sed ändern.
  • Präzision: Befehlszeilenargumente garantieren, dass die richtige Zeichenfolge ersetzt wird, auch wenn der Text komplex ist.
  • Automatisierung: Du kannst Befehlszeilenargumente in Skripten verwenden, um Ersetzungen zu automatisieren.

Optionen für Befehlszeilenargumente

Neben der Angabe der zu suchenden und zu ersetzenden Zeichenfolge kannst du die folgenden Optionen in deinen Befehlszeilenargumenten verwenden:

  • -i: Diese Option weist sed an, die Änderungen an der Eingabedatei vorzunehmen, anstatt den geänderten Text auf der Konsole auszugeben.
  • -r: Diese Option aktiviert reguläre Ausdrücke für die zu suchende Zeichenfolge und den Ersatz. Weitere Informationen zu regulären Ausdrücken findest du in unserem Abschnitt Ersetzen mit regulären Ausdrücken.
  • -n: Diese Option unterdrückt die Ausgabe von sed und gibt nur die Anzahl der durchgeführten Ersetzungen zurück.
  • –in-place=SUFFIX: Diese Option funktioniert ähnlich wie -i, fügt jedoch ein Suffix an den Dateinamen an, um eine Sicherungskopie der Originaldatei zu erstellen.

Beispiele für Befehlszeilenargumente

  • Suche und Ersetzung einzelner Zeichenfolgen:
sed "s/Beispiel/Ersatz/" text.txt
  • Suche und Ersetzung mit regulären Ausdrücken:
sed -r "s/(Linux|Unix)/Betriebssystem/" text.txt
  • Ersetzen mit einer leeren Zeichenfolge:
sed "s/leer//" text.txt
  • Mehrere Ersetzungen in einer Zeile:
sed "s/Linux/Unix/; s/frei/kostenlos/" text.txt

Indem du Befehlszeilenargumente verwendest, kannst du die Textmanipulationsfähigkeiten von sed voll ausschöpfen und komplexe Ersetzungen mit Präzision und Flexibilität durchführen.

Ersetzen mit Skripten

Du kannst die Ersetzungsfunktionen von sed in Shell-Skripten verwenden, um komplexe Textersetzungen mit minimalem Aufwand durchzuführen.

Anwendungsfälle

Skripte eignen sich besonders für:

  • Batch-Verarbeitung: Ersetze Text in mehreren Dateien gleichzeitig.
  • Automatisierte Suchen und Ersetzungen: Führe Ersetzungsvorgänge aus, die auf bestimmten Bedingungen basieren.
  • Erweiterte Textverarbeitung: Kombiniere sed-Befehle mit anderen Shell-Befehlen, um komplexe Textmanipulationen durchzuführen.

Erstellen eines Skripts

Um ein sed-Skript zu erstellen, führe folgende Schritte aus:

  1. Erstelle eine neue Textdatei mit einem beliebigen Texteditor.
  2. Füge deine sed-Befehle in die Datei ein.
  3. Speichere die Datei mit der Erweiterung .sh.

Beispielskript

Angenommen, du hast eine Datei namens text.txt mit folgendem Inhalt:

Dies ist ein Beispieltext.
Dies ist eine weitere Zeile.
Dies ist die letzte Zeile.

Erstelle ein Skript namens replace_script.sh mit folgendem Inhalt:

#!/bin/bash

sed -i -e 's/Beispiel/Ersatz/g' text.txt

Ausführen des Skripts

Führe das Skript mit folgendem Befehl aus:

bash replace_script.sh

Das Skript ersetzt alle Vorkommen von "Beispiel" durch "Ersatz" in der Datei text.txt.

Tipps

  • Verwende die Option -i (inline), um die Datei direkt zu bearbeiten, anstatt eine temporäre Kopie zu erstellen.
  • Nutze den Flag -g (global), um alle Vorkommen einer Zeichenfolge zu ersetzen.
  • Verwende die Substitutionsoperatoren "s", "r" und "G" für verschiedene Ersetzungstypen.
  • Kombiniere sed-Befehle mit anderen Shell-Befehlen, um die Skriptfunktionen zu erweitern (z. B. grep, awk, sed).
  • Nutze Online-Ressourcen wie sed.info und Stack Overflow, um weitere Informationen zu erhalten.