У меня есть файл 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".
Почему это? Что такое логика позади него?
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" для включения глобальной замены. Без этого это только заменило бы каждое первое соответствие на строку.
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