11

Я не совсем понимаю, как работают опции -s , -t и -c в команде tr . Когда я делаю

echo I am a good boy | tr good bad

Я получаю вывод:

I am a bddd bdy

Это вполне понятно, так как o повторяется в good . Последнее возможно изменение вместо o является d и , следовательно , выходной сигнал.

Теперь, когда я делаю

echo I am a good boy | tr -s good bad

выход

I am a bd bdy

Предполагается, что опция -s сжимает каждый повторяющийся вхождений каждого символа в наборе 1 в один и затем заменяет каждый символ в наборе 1 на соответствующий символ в наборе 2, который находится в той же позиции.

Так и должно было быть

I am a bad bay.

Почему изменения?

Более того, когда я делаю

echo I am a good boy | tr -c good bad

Я получаю dddddddgoodddodd

Как работает опция -c для tr , ссылаясь на этот пример?

И напоследок: как превратить себя из хорошего мальчика в плохого мальчика .... :): P То есть

echo I am a good boy | tr <something> дает мне вывод: I am a bad boy .

4 ответа4

10

-s Switch: Squeeze (удалить повторяющиеся символы)

echo i am a good boy | tr -s good bad

вывод: i am a bd bdy

За кулисами происходят две вещи, которые делают это возможным. Во-первых, если второй аргумент tr короче первого, то последний символ во втором аргументе повторяется, чтобы сделать его такой же длины, как и первый. Итак, эквивалентная команда:

echo i am a good boy | tr -s good badd

Другая вещь, которая происходит, - когда символы в первом аргументе повторяются, они перезаписывают любое предыдущее вхождение (я имею в виду два oo в good). Это делает команду теперь эквивалентной:

echo i am a good boy | tr -s god bdd

(второе o замене d перезаписывает предыдущее o до замены, что делает его излишним)

Без ключа -s вывод будет

i am a bddd bdy

С ключом -s tr 'сжимает' любые повторяющиеся символы, которые перечислены в последнем аргументе, оставляя окончательный вывод:

i am a bd bdy

-c Переключатель: Дополнение

-c используется, чтобы соответствовать дополнению первого аргумента (т. Е. Все символы, не перечисленные в аргументе 1). В результате arg 1 будет содержать много букв (256-3). Теперь с аргументом 2 происходит то же самое, что и в предыдущем случае: последний символ аргумента 2 повторяется в соответствии с длиной или аргументом 1. Итак, оригинальное утверждение:

echo i am a good boy | tr -c good bad

эквивалентно:

echo i am a good boy | tr abcefhijklmnp... baddddddddddd...

(обратите внимание на отсутствующие g , o и d в первом наборе, также обратите внимание, что d заменит все остальные символы во втором наборе - включая символ пробела)

Вот почему i am a good boy превращается в dddddddgoodddodd

Более подробная информация здесь: http://www.linuxjournal.com/article/2563

4

Ваше понимание -s неверно, оно заменяет повторяющиеся вхождения символов в наборе 1 на входе одним символом. это не изменяет набор, например.

echo i am a good boy | tr -s god bad

дает

i am a bad bay

Опция -c заменяет набор 1 его дополнением (т. Е. Набором всех символов, не содержащихся в наборе 1). Вы можете использовать это, чтобы удалить все, кроме указанных символов, например.

echo i am a good boy | tr -cd gobdy

выходы

goodboy
1

Другие ответы касались параметров tr 's -s , -t и -c , но для полноты:

У вас проблемы, потому что вы выбрали не тот инструмент.

  • tr для преобразования символов
  • sed для потокового редактирования.

Так как и good и bad являются последовательностью символов в потоке, sed лучше подходит.

echo I am a good boy | <something> дает мне вывод как: I am a bad boy

$ echo I am a good boy | sed s/good/bad/g
I am a bad boy

s/..../..../ является заменой. Что бы ни соответствовало первому регулярному выражению, оно будет заменено вторым. Флаг /g в конце предназначен для глобальной замены, поэтому все вхождения будут заменены не только первыми.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/
I am a bad boy and a good boy is me.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/g
I am a bad boy and a bad boy is me.
0

да. именно так!

tr -s заменяет экземпляры повторяющихся символов одним символом.

(через страницу руководства.)

Итак, это выглядит так:

это преобразует good в bddd . повторные случаи 3 'd.

поэтому он заменяет эти три экземпляра одним экземпляром.

то есть это делает его бд. :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .