Як параметри команди '-s', '-t' і '-c' команди tr працюють в Unix?


12

Я збентежений щодо шляху -s, -tі -cваріанти роботи в т.р. команді. Коли я це роблю

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.

Відповіді:


12

-s Перемикач: стиснути (видалити повторні символи)

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

Інша річ, що відбувається, коли символи в першому аргументі повторюються, вони перезаписують будь-яке попереднє явище (я маю на увазі два oos в good). Це робить команду зараз рівносильною:

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

(Другий oдля dзаміни перезаписує попередній oна aзаміну, що робить його надмірною)

Без -sвимикача вихід був би

i am a bddd bdy

За допомогою -sперемикача tr'видавлює' будь-які повторювані символи, перелічені в останньому аргументі, залишаючи остаточний вихід:

i am a bd bdy

-c Перемикач: доповнення

-cПеремикач використовується відповідно до доповнення першого аргументу (тобто всіх символів , які не зазначені в Агді 1). Як результат, arg 1 буде містити багато літер (256-3). Тепер з аргументом 2 відбувається те саме, що і в попередньому випадку: остаточний символ Arg 2 повторюється, щоб відповідати довжині або Arg 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


Загалом правильно, за винятком того, що -sперемикач змушує trвидавити будь-які символи з останнього аргументу до tr(не першого, як ви кажете), які повторюються на вході. Це зазначається у статті, яку ви пов’язали, і пояснюється в останньому абзаці в розділі "Опис" довідкової сторінки .
ravron

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

: Я зрозумів ваш варіант щодо -s варіанту, але моє питання: як, ехо, я хороший хлопчик | tr -s добре погано дає вихід, як: я - bd bdy, це можливо лише тоді, коли це трапляється: спочатку я хороший хлопчик змінюється на я є bddd bdy, потім опція -s змінює виникнення кількох d на одиничні тобто: я - bddd bdy, потім змінюється на я - bd bdy - це те, що відбувається насправді? будь ласка, розбийте це для мене, те ж саме з -c варіантом, як відлуння, я хороший хлопчик | tr -cd gobdy даючи це: goodboy

1

Інші відповіді покриті tr«и -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/..../..../Є Substitute. Незалежно від першого первинний вираз буде замінено другим. /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 замінює екземпляри повторних символів одним символом.

(через сторінку Man.)

так, це виходить так:

він перетворюється goodна bddd. повторні екземпляри - 3 'd'.

тому він замінює ці три екземпляри одним екземпляром.

тобто це робить його bd. :)


2
Ми не очікуємо, що кожна відповідь буде ідеальною, але відповіді з правильним написанням, пунктуацією та граматикою легше читати.
Ashildr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.