Mam plik, ma.txt
który zawiera dane wyjściowe ls -l
; po uruchomieniu tr
polecenia ( tr "nik-pc" "root"
) otrzymuję następujące dane wyjściowe:
nik-pc@nik:~$ 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
nik-pc@nik:~$ 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
W pierwszym wierszu zastąpił „nik” słowem „too”, a pisownia „Desktop” zmieniła się w „Desottt”.
Dlaczego to? Co za tym stoi logika?
command-line
tr
Manish Bharti
źródło
źródło
info coreutils 'tr invocation'
mówi szczegółowo, cotr
robi.nik-pc
zroot
?n
również jest wk-p
zakresie. Wynik pojawienia się znaku więcej niż raz w pierwszym zestawie nie jest określony przez POSIX.sed
polecenie ...ls -l | sed 's/nik-pc/root/'
zrobi to, co chcesz.tr
służy do konwersji pojedynczych znaków - np. małe i wielkie litery lub przesunięcie wiersza w stylu dos (\ r) do stylu uniksowego (\ n) lub coś w rodzaju zastąpienia wszystkich ukośników odwrotnych (Windows) ukośnikami. Może także usuwać „niechciane” znaki, np. wszystkie cyfry lub wszystkie wielkie litery.Odpowiedzi:
tr
tłumaczy łańcuch znaków. Przeszukuje litery z pierwszego zestawu i zastępuje je literami z drugiego zestawu.Miałeś
nik-pc
jako pierwszy zestaw.tr
rozszerza tęk-p
część na wszystkie litery w zakresie od „k” do „p”, więc zestaw jest równyniklmnopc
.Twój drugi zestaw był
root
.Co
tr
teraz robi to, aby szukać wszystkie wystąpienia pierwszego znaku w (analizowany) pierwszego zestawu i wymienić je na pierwszy znak drugiego zestawu. Gdy w zestawie 2 nie ma już żadnej postaci, po prostu powtarza swój ostatni znak. Tabela poniżej:Teraz jest jasne, dlaczego np. „Desktop” staje się „Desottt”. Zachowanie jest w pełni poprawne i zamierzone w ten sposób.
To, czego szukasz, można osiągnąć za pomocą
sed
:Składnia jest następująca:
Pozwalamy więc wyszukiwać wzór „nik-pc” i zastępujemy całe dopasowanie słowem „root”. Musimy dodać flagę „g”, aby umożliwić zastępowanie globalne. Bez tego zastąpiłoby tylko każde pierwsze dopasowanie w linii.
źródło
printf "A\nB\nC\n" | tr 'ABC' '12'
tr
służy do tłumaczenia znaków, a nie do pełnych słów. Może tłumaczyć zestawy. W twoim przykładzie masz „nik-pc” jako znaki pierwszej kolekcji, a „root” to kolejny. W rzeczywistościk-p
jest zakresem, więc obejmuje wszystkie znaki od k do p. Będzie pasował do znaków jeden po drugim, więc n będzie tłumaczyć na r, i do o, k do o, i cokolwiek innego poza 4. char będzie t. Właśnie dlatego przetłumaczono „Desktop” na „Desottt”Możesz to lepiej zobaczyć w tym przykładzie:
Tutaj widać, że
tr
zestaw 1 ma D w pozycji 4. Ale zestaw 2 nie ma pozycji 4, więc użyje ostatniej pozycji, zestaw 2 musi się przełożyć.To, co robisz, polega na tłumaczeniu jednego słowa na drugie. To, co chcesz zrobić, to użyć bardziej zaawansowanego narzędzia, takiego jak
sed
lubawk
.Na przykład,
źródło