Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

tr - Zeichen ersetzen oder löschen

&pagelevel(4)&pagelevel

(translate characters)


tr liest einen Eingabetext von der Standard-Eingabe, ersetzt (Format 1 und 2) oder löscht (Format 3 und 4) einzelne Zeichen und schreibt das Ergebnis auf die Standard-Ausgabe.


Syntax


Format 1: tr[ -cs] zeichenkette1 zeichenkette2
Format 2: tr -s[ -c] zeichenkette1
Format 3: tr -d[ -c] zeichenkette1
Format 4: tr -ds[ -c] zeichenkette1 zeichenkette2

Wenn Sie bei einem Aufruf mehrere Optionen angeben, dann können Sie diese in allen Formaten mit einem führenden Bindestrich und ohne Leerzeichen aneinanderreihen, z.B. -cs oder -dc.

Zeichen ersetzen
Format 1: tr[ -cs] zeichenkette1 zeichenkette2
Format 2: tr -s[ -c] zeichenkette1


tr ersetzt im Eingabetext jedes Zeichen, das in zeichenkette1 vorkommt, durch das entsprechende Zeichen in zeichenkette2: Das i-te Zeichen in zeichenkette1 wird im Eingabetext ersetzt durch das i-te Zeichen in zeichenkette2. Ist zeichenkette2 kürzer als zeichenkette1, dann werden die Zeichen aus zeichenkette1, zu denen es kein entsprechendes Zeichen in zeichenkette2 gibt, nicht ersetzt (siehe Beispiel 1).


-c

(c - complement)

zeichenkette1 wird bezüglich des aktuell gültigen Zeichensatzes (mit oktalen Werten 001 bis 377) komplementiert. Die komplementierte zeichenkette1 enthält dann alle Zeichen des aktuell gültigen Zeichensatzes außer den in der ursprünglichen zeichenkette1 angegebenen Zeichen.
Anschließend ersetzt tr im Eingabetext das i-te Zeichen in der komplementierten zeichenkette1 durch das i-te Zeichen in zeichenkette2.

-s

(s - squeeze)

Nach der Ersetzung verkürzt tr in der Ausgabe jede Folge von gleichen Zeichen, die in zeichenkette2 vorkommen, zu einem Zeichen (siehe Beispiel 2).

zeichenkette1 [zeichenkette2]

In zeichenkette1 geben Sie die Zeichen an, die ersetzt werden sollen. zeichenkette2 ist die Ersetzungszeichenkette.

In beiden Zeichenketten müssen Sie die Zeichen ohne Leer- oder sonstige Trennzeichen aneinanderreihen.

Enthält eine Zeichenkette Zeichen, die für die Shell eine besondere Bedeutung haben, müssen Sie die Zeichenkette in Hochkommas ’...’ einschließen oder die Zeichen mit einem vorangestellten Gegenschrägstrich \ entwerten.

Die Zeichenketten können folgende Angaben enthalten:

zeichen

beliebiges druckbares Zeichen.

\oktalzahl

wobei oktalzahl eine ein-, zwei- oder dreistellige Oktalzahl ist. Den Gegenschrägstrich müssen Sie entwerten, damit die Ziffern als Oktalzahl erkannt werden.

tr bearbeitet auch das Zeichen NUL (\000). Achtung: In früheren Versionen wurde das Zeichen NUL als Eingabezeichen stets gelöscht.

sonderzeichen

als Escape-Sequenzen wie beim Kommando printf. Folgende Escape-Sequenzen können Sie angeben:

\\Backslash (zur Unterscheidung von Oktalzahlen)
\aWarnung, Klingel *)
\bBackspace, Rücksetzzeichen *)
\fForm Feed, Seitenvorschub
\nNew Line, Zeilenumbruch
\rCarriage Return, Wagenrücklauf
\tTabulator
\vVertikal-Tabulator *)

*) Die so markierten Sonderzeichen werden nur auf Zeichenterminals unterstützt (also bei Zugang zur POSIX-Shell über rlogin).

a-z oder [a-z]

steht für die Folge der Zeichen von a bis z einschließlich. Die Zeichen sind gemäß der aktuell gültigen Sortierreihenfolge geordnet. Im Unterschied zu internationalisierten regulären Ausdrücken dürfen a und z nur einfache Zeichen, d.h. keine Ausdrücke für Äquivalenzklassen [=c=] oder Zeicheneinheits-Symbole [.cc.] sein.

Das für a eingesetzte Zeichen muss in der aktuellen Sortierreihenfolge (siehe LC_COLLATE) dem für z eingesetzten Zeichen vorangehen.

"b-a" ist ein ungültiger Zeichenbereich und wird zurückgewiesen.

In der Schreibweise ohne Klammern steht "a-a" nur für "a" usw., "---" wird dagegen als drei "-"-Zeichen aufgefasst. In der Klammer-Schreibweise führen "[a-a]" und "[---]" zu undefinierten Ergebnissen.

"a-c" bedeutet je nach Lokalität "abc" oder "aäbc", "n-p" bedeutet je nach Lokalität "nop" oder "noöp" oder "nöop", "t-v" bedeutet je nach Lokalität "tuv" oder "tuüv" oder "tüuv", "r-t" kann je nach Lokalität "rst", "rsßt" oder "rßst" bedeuten.

[:klasse:]

klasse gibt eine Zeichenklasse an, ähnlich wie bei internationalen regulären Ausdrücken. Folgende Werte für klasse sind möglich:

alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit

Zeichenklassen dürfen nicht in einer Ersetzungszeichenkette angegeben werden. Ausnahme: Die Klassen lower und upper sind zulässig, wenn in zeichenkette1 an derselben Stelle die korrespondierende Zeichenklasse angegeben ist.

[=äquivalenz=]

äquvalenz gibt eine Äquivalenzklasse an, ähnlich wie bei internationalen regulären Ausdrücken.

Äquivalenzklassen dürfen nicht in einer Ersetzungszeichenkette angegeben werden.

[a*n]

steht für n-mal das Zeichen a. Z.B. [a*3] steht für aaa.

Ist die erste Ziffer von n 0, so wird n als Oktalzahl interpretiert, andernfalls als Dezimalzahl.Wenn n fehlt oder 0 ist, dann steht der Ausdruck für so viele Wiederholungen des Zeichens a, wie nötig sind, um zeichenkette2 auf die Länge von zeichenkette1 aufzufüllen (siehe Beispiel 1).

zeichenkette2 nicht angegeben:
Für zeichenkette2 wird die (evtl. komplementierte, siehe -c) zeichenkette1 genommen.

zeichenkette1 und zeichenkette2 nicht angegeben:
zeichenkette1 ist die leere Zeichenkette. Für zeichenkette2 wird entweder die leere Zeichenkette (ohne Option -c) oder der gesamte, aktuell gültige Zeichensatz (mit Option -c) genommen.

Zeichen löschen
Format 3: tr -d[ -c] zeichenkette1
Format 4: tr -ds[ -c] zeichenkette1 zeichenkette2


Ein Aufruf in diesem Format ist nur dann sinnvoll, wenn zeichenkette1 angegeben ist. zeichenkette2 wird ignoriert, wenn Option -s nicht angegeben ist.


-d

(d - delete)

Alle Eingabezeichen, die in zeichenkette1 vorkommen, werden gelöscht.
Wenn Option -s nicht angegeben ist, wird zeichenkette2 ignoriert.

-c

(c - complement)

zeichenkette1 wird bezüglich des aktuell gültigen Zeichensatzes komplementiert. Die komplementierte zeichenkette1 enthält dann alle Zeichen des aktuell gültigen Zeichensatzes außer den, in der ursprünglichen zeichenkette1 angegebenen Zeichen.

Anschließend löscht tr alle Eingabezeichen, die in der komplementierten zeichenkette1 vorkommen.

-s

(s - squeeze)

tr verkürzt in der Ausgabe jede Folge von gleichen Zeichen, die in zeichenkette2 vorkommen, zu einem Zeichen. Ist zeichenkette2 nicht angegeben, ist die Option - s wirkungslos.

zeichenkette1 [zeichenkette2]

In zeichenkette1 geben Sie die Zeichen an, die gelöscht werden sollen. zeichenkette2 enthält die Zeichen, die nur einmal ausgegeben werden sollen, falls sie in der Ausgabe mehrfach hintereinander auftreten (siehe Option -s).

Im Abschnitt Format 1 ist beschrieben, wie Sie die beiden Zeichenketten eingeben können.

zeichenkette1 und zeichenkette2 nicht angegeben:
Ist Option -c nicht angegeben, werden die Eingabezeichen unverändert auf die Standard-Ausgabe kopiert. Ist -c angegeben, wird nichts auf die Standard-Ausgabe ausgegeben, da tr sämtliche Eingabezeichen löscht.

Internationale Umgebung

Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos tr:

LANG

Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden.

LC_ALL

Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen.

LC_COLLATE

In geklammerten Ausdrücken bestimmt diese Variable die Bedeutung von Zeichenbereichen (z.B. [a-z]).

LC_CTYPE

Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten). Zudem bestimmt LC_CTYPE, welche Zeichen bei Verwendung der Option -c in der aktuell gültigen Zeichenmenge enthalten sind.

LC_MESSAGES

Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden.

NLSPATH

Legt den Pfad der Meldungsdateien für LC_MESSAGES fest.

Hinweise

Zeichenbereiche von Groß- und Kleinbuchstaben lassen sich in Lokalitäten, die das Zeichen ’ß’ enthalten, nicht immer eindeutig aufeinander abbilden (siehe dazu oben unter "Zeichen ersetzen"). Eine Ausnahme bilden die Zeichenbereiche “a-z” und “A-Z”, die ab dieser POSIX-Version gesondert behandelt werden.

Versuchen Sie trotzdem nicht, mit dem folgenden Kommando Kleinbuchstaben in Großbuchstaben umzuwandeln. Das Ergebnis ist in einer anderen als der POSIX- oder C-Lokalität nicht definiert und kann in älteren POSIX-Versionen oder auf anderen Plattformen verschieden ausfallen:

$ tr 'a-z' 'A-Z' <datei

Verwenden Sie zum Umwandeln von Kleinbuchstaben in Großbuchstaben (oder umgekehrt) stattdessen die Zeichenklassen:

$ tr '[:lower:]' '[:upper:]' <datei

$ tr '[:upper:]' '[:lower:]' <datei

Voraussetzung für eine korrekte Umsetzung ist hier allerdings, dass LC_CTYPE und LC_COLLATE auf die gleiche Lokalität verweisen. Dies können Sie durch die Zuweisung von LANG oder LC_ALL sicherstellen.

Beispiel 1

tr ohne Option - einfache Beispiele, die die Wirkungsweise von tr zeigen

$ cat tage

Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag

$ tr MD md <tage
montag dienstag mittwoch donnerstag Freitag Samstag Sonntag

tr ersetzt alle M durch m und alle D durch d.

$ tr MDF md <tage

montag dienstag mittwoch donnerstag Freitag Samstag Sonntag

Hier ist die zweite Zeichenkette kürzer als die erste. tr ersetzt alle M durch m und alle D durch d, das F bleibt jedoch unverändert.

Nun soll jeder Kleinbuchstabe durch x ersetzt werden. Der folgende Aufruf leistet das Gewünschte nicht:

$ tr '[a-z]' x <tage

Montxg Dienstxg Mittwoch Donnerstxg Freitxg Sxmstxg Sonntxg

Hier ersetzt tr nur das a durch x. Sollen alle Kleinbuchstaben ersetzt werden, dann muss man tr folgendermaßen aufrufen:

$ tr '[a-z]' '[x*]' <tage

Mxxxxx Dxxxxxxx Mxxxxxxx Dxxxxxxxxx Fxxxxxx Sxxxxxx Sxxxxxx

Hier gehört zu jedem Zeichen in Zeichenkette1 ein x in Zeichenkette2, da durch den Stern * die Zeichenkette2 mit x aufgefüllt wird. Die Hochkommas sind notwendig, da die Zeichenketten Shell-Sonderzeichen enthalten.

Beispiel 2

Es soll eine Liste aller Wörter, die in der Datei text vorkommen, erstellt werden, wobei jedes Wort auf einer eigenen Zeile steht. Ein Wort sei eine Zeichenkette, die nur aus Buchstaben besteht.

$ cat text

"An der Liebe Niederlagen

laesst der Dichter Lieder nagen."

$ tr -cs [A-Z][a-z] '[\025*]' <text

An

der

Liebe

Niederlagen

laesst

der

Dichter

Lieder

nagen

Beispiel 3

Nichtdruckbares Zeichen aus einer Datei löschen (tr -d):

$ tr -d '\016' <datei

tr löscht aus der Datei das Zeichen, dessen Code oktal den Wert 016 hat, und gibt das Ergebnis auf die Standard-Ausgabe aus.

Siehe auch

ed, sh, sed