Как TR переводит одно слово в другого?

У меня есть файл ma.txt и это содержит вывод ls -l; когда я работаю tr команда (tr "nik-pc" "root") Я получаю этот вывод:

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

В строке один это заменило "nik" "также", и написание "Рабочего стола" стало "Desottt".

Почему это? Что такое логика позади него?

9
задан 17 March 2016 в 08:21

2 ответа

tr переводит мудрое символом строки. Это ищет буквы от первого набора и заменяет их теми, формируют второй набор.

Вы имели nik-pc как сначала установлено. tr расширяется k-p часть в этом ко всем буквам в диапазоне от "k" до "p", таким образом, набор равен niklmnopc.

Ваш второй набор был root.

Что tr теперь делает должен искать все случаи первого символа в (оцененном) первом наборе и заменить их первым символом второго набора. Когда больше нет символа в наборе 2, он просто повторяет свой последний знак. См. приведенную ниже таблицу:

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

Таким образом, теперь ясно, почему, например, "Рабочий стол" становится "Desottt". Поведение полностью корректно и предназначило этот путь.


Что Вы ищете, вместо этого может быть достигнут с помощью sed:

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

Синтаксис - это:

sed 's/SEARCH_PATTERN/REPLACE_STRING/FLAGS' INPUT_FILE

Таким образом, мы позволяем ему искать шаблон "nik-ПК" и заменить все соответствие "корнем". Мы должны добавить флаг "g" для включения глобальной замены. Без этого это только заменило бы каждое первое соответствие на строку.

16
ответ дан 23 November 2019 в 04:46

tr для перевода символов, не для полных слов. Это может перевести наборы. В Вашем примере у Вас есть "nik-ПК" как первые символы набора, и "корень" - другой. На самом деле, k-p диапазон, таким образом, он включает все символы от k до p. Это будет соответствовать символам один за другим, таким образом, n переведет в r, я к o, k к o, и безотносительно вне 4-го символа буду t. Вот почему Вам перевели "Рабочий стол" в "Desottt"

, Вы видите его более ясно в этом примере:

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

Здесь Вы видите tr устанавливать 1, имеют D в положении 4. Но набор 2 не имеет никакого положения 4, таким образом, он будет использовать набор последней позиции 2, должен перевести.

то, Что Вы делаете, переводит одно слово в другого. То, что Вы хотите сделать, использовать более усовершенствованный инструмент как sed или awk.

, Например,

$ ls -l /etc/passwd | awk '{gsub(/root/,"TEST");print}'        
-rw-r--r-- 1 TEST TEST 2575 Feb 29 12:30 /etc/passwd
18
ответ дан 23 November 2019 в 04:46

Другие вопросы по тегам:

Похожие вопросы: