2

У меня есть два вопроса по поводу команды tr в оболочке Linux:

$ echo 'abcd123' | tr -c 'a-z' '0-9'

результат: «abcd9999». У него 4-9, почему? И почему 9, а не один из '0-8'? ② это:

$ echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'

результат есть; «1 2 4», кто-нибудь может мне это объяснить? как это выполняется?

2 ответа2

3

Первый вопрос:

echo 'abcd123' фактически выводит 'abcd123\n' на стандартный вывод. А для tr -c 'a-z' '0-9' опция -c означает, что для перевода будет использоваться дополнение к 'a-z' , см. Справочную страницу tr .

Гораздо больше символов, кроме «az», соответствуют «0-9», поэтому оставшийся символ 'abcd123\n' , исключая строчные буквы, то есть '123\n' , будет переведен в '9999' . Таким образом, результатом является 'abcd9999', с последующим '\n'.

Второй вопрос очень прост:

echo hello 1 char 2 next 4 распечатать hello 1 char 2 next 4\n to stdout. 'tr -d -c '0-9 \n'' удаляет каждое дополнение числа '0-9' символа пробела и '\n'.

Вот почему оставшийся символ содержит цифры и пробелы и, между прочим, завершающий символ '\n'.

2

По поводу команды:

echo 'abcd123' | tr -c 'a-z' '0-9'

Man-страница для tr говорит:

tr [OPTION]... SET1 [SET2]

... SET2 расширяется до длины SET1, повторяя последний символ по мере необходимости ...

Дополнением к "az" являются все символы, кроме строчных букв. Таким образом, этот набор немного длиннее десяти символов в «0-9», а цифры в строке "abcd123" совпадают с повторяющимся последним символом "9".

В:

echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'

Вы эффективно говорите tr удалить все, что не входит в набор символов, которые вы задаете в качестве SET1. Таким образом, он удаляет все символы, кроме цифр, пробела и новой строки. Я не уверен, что еще вы могли ожидать здесь.

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