web-dev-qa-db-de.com

Wie übersetzt man ein Wort in ein anderes?

Ich habe eine Datei ma.txt und sie enthält die Ausgabe von ls -l; Wenn ich den Befehl tr (tr "nik-pc" "root") ausführe, erhalte ich folgende Ausgabe:

[email protected]:~$ cat ma.txt 
total 52
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 11:33 Desktop
lrwxrwxrwx 1 nik-pc nik-pc    2 Mar  8 22:54 di -> hd
drwxr-xr-x 3 nik-pc nik-pc 4096 Mar 13 13:28 Documents
drwxr-xr-x 7 nik-pc nik-pc 4096 Mar 14 18:21 Downloads
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 09:39 dwhelper
-rw-r--r-- 1 nik-pc nik-pc 2134 Mar 13 17:40 hd
-rw-r--r-- 1 nik-pc nik-pc    3 Mar 13 15:34 m
-rw-r--r-- 1 nik-pc nik-pc    0 Mar 17 19:48 ma.txt
drwxr-xr-x 3 nik-pc nik-pc 4096 Mar 13 14:58 Music
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 12:30 Pictures
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 11:44 Public
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 13 15:58 sd
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 11:44 Templates
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 11:44 Videos
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 11:33 xdm-helper

[email protected]:~$ tr "nik-pc" "root" < ma.txt 
tttat 52
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 11:33 Desottt
trwxrwxrwx 1 too-tt too-tt    2 Mar  8 22:54 do -> hd
drwxr-xr-x 3 too-tt too-tt 4096 Mar 13 13:28 Dttutetts
drwxr-xr-x 7 too-tt too-tt 4096 Mar 14 18:21 Dtwtttads
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 09:39 dwhetter
-rw-r--r-- 1 too-tt too-tt 2134 Mar 13 17:40 hd
-rw-r--r-- 1 too-tt too-tt    3 Mar 13 15:34 t
-rw-r--r-- 1 too-tt too-tt    0 Mar 17 19:48 ta.txt
drwxr-xr-x 3 too-tt too-tt 4096 Mar 13 14:58 Musot
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 12:30 Pottures
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 11:44 Pubtot
drwxr-xr-x 2 too-tt too-tt 4096 Mar 13 15:58 sd
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 11:44 Tetttates
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 11:44 Vodets
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 11:33 xdt-hetter

In Zeile eins wurde "nik" durch "too" ersetzt und die Schreibweise von "Desktop" wurde zu "Desottt".

Warum ist das? Was steckt dahinter?

9
Manish Bharti

tr übersetzt eine Zeichenfolge zeichenweise. Es durchsucht die Buchstaben aus dem ersten Satz und ersetzt sie durch die aus dem zweiten Satz.

Sie hatten nik-pc als ersten Satz. tr erweitert den Teil k-p auf alle Buchstaben im Bereich von "k" bis "p", sodass die Menge gleich niklmnopc ist.

Dein zweiter Satz war root.

Was tr jetzt tut, ist, alle Vorkommen des ersten Zeichens in der (ausgewerteten) ersten Menge zu suchen und sie durch das erste Zeichen der zweiten Menge zu ersetzen. Wenn in Satz 2 kein Zeichen mehr vorhanden ist, wird einfach das letzte Zeichen wiederholt. Siehe die Tabelle unten:

n --> r
i --> o
k --> o
l --> t
m --> t
n --> t
o --> t
p --> t
c --> t

Jetzt ist klar, warum z. "Desktop" wird zu "Desottt". Das Verhalten ist völlig korrekt und auf diese Weise beabsichtigt.


Was Sie stattdessen suchen, können Sie mit sed erreichen:

sed 's/nik-pc/root/g' ma.txt

Die Syntax lautet wie folgt:

sed 's/SEARCH_PATTERN/REPLACE_STRING/FLAGS' INPUT_FILE

Also lassen wir es nach dem Muster "nik-pc" suchen und ersetzen das gesamte Match durch "root". Wir müssen das "g" -Flag hinzufügen, um globales Ersetzen zu ermöglichen. Ohne das würde es nur jede erste Übereinstimmung pro Zeile ersetzen.

16
Byte Commander

tr dient zum Übersetzen von Zeichen, nicht für vollständige Wörter. Es kann Mengen übersetzen. In Ihrem Beispiel haben Sie "nik-pc" als erste Sammelzeichen und "root" ist ein anderes. Tatsächlich ist k-p ein Bereich, der alle Zeichen von k bis p enthält. Es passt Zeichen nacheinander an, also wird n zu r, i zu o, k zu o und was auch immer jenseits des 4. Zeichens sein wird, zu t. Deshalb haben Sie "Desktop" in "Desottt" übersetzt

Sie können es in diesem Beispiel deutlicher sehen:

$ echo "ABCDEF" | tr "ABCDEF"  "12"                            
122222

Hier sehen Sie tr Satz 1 hat D in Position 4. Satz 2 hat jedoch keine Position 4, daher wird die letzte Position verwendet, die Satz 2 übersetzen muss.

Sie übersetzen ein Wort in ein anderes. Sie möchten ein erweitertes Tool wie sed oder awk verwenden.

Zum Beispiel,

$ ls -l /etc/passwd | awk '{gsub(/root/,"TEST");print}'        
-rw-r--r-- 1 TEST TEST 2575 Feb 29 12:30 /etc/passwd
18