2013-08-24 2 views
-1

Я смущен насчет последовательности выполнения tr вариантов.Что делает tr -ct?

Например, есть команда, как это:

echo 123 | tr -ct '\n' '0' 

Как это выполнить? Выполняется ли -c или -t?

И я также смущен результатом этой команды. Я думал, что -c был исполнен первым, и результат 123, затем -t будет исполнен, а результат 023, а финал - 023\n. Но это неправильно, правильный ответ: 123\n, Я не знаю, почему, может кто-нибудь мне сказать?

+4

Оболочка не анализирует аргументы для 'tr' – Hasturkun

+0

Как это выполнить? Может ли кто-нибудь сказать мне? – huashui

ответ

0

Удовлетворительно, tr -ct, кажется, дополняет первый комплект, , затем усекает его до длины второго набора. Вероятно, это не следует полагаться на, учитывая, что -t говорит, что он «сначала усекает SET1 до длины SET2».

В любом случае, очевидно, что эффект -c применяется во-первых, преобразование первого набора \n в набор, содержащий все символы, кроме \n и сортируются в порядке возрастания (поэтому первый символ является символом NUL \0). Затем накладывается -t, в результате чего набор усекается до \0. Таким образом, tr переведёт символы NUL в символы 0.

В качестве примера рассмотрим следующее:

$ tr --version 
tr (GNU coreutils) 8.13 
$ echo -e 'X\0X' 
XX 
$ echo -e 'X\0X' | tr -ct '\n' '0' 
X0X 
0

-c означает использовать дополнение символов в string1, или «любой символ, а не в string1 заменяет значение string1».

-t означает усечение первого набора значений до длины второго набора. Строка 2 имеет длину только 1 символ, поэтому строка1 усечена до этой длины.

Другими словами: тр-ct '\ п' '0' -> тр -t '\ 000 \ 001 \ 002 ...... ABCDEF ...' '0' -> тр '\ 000' '0'

Попробуйте это проверить:

printf '\000afoo\n' | tr -ct '\na' '7' 

"Любой символ, не '\ п' или 'а'" (-с) становится '\ 000' (-t), потому что для строки 2 указано значение «7», длина которого равна 1. Теперь попробуйте следующее:

printf '\000afoo\n' | tr -ct '\na' '[7*]' 

«Любой символ, который не является« \ n »или« a »(-c), остается, поскольку для любого символа в этом наборе используется« 7 ». Это поведение по умолчанию GNU и исторического BSD tr, поэтому «7» работает так же, как и «[7 *]», если -t не указано. Для System V и POSIX tr «[7 *]» является повторяющейся формой, а «7» просто заменяет первый символ в первом наборе на «7», что, возможно, более интуитивно и, безусловно, является частью того, где возникает ваша проблема from (GNU tr изменяет поведение в System V, если задано -t).

Смежные вопросы