У меня есть один конкретный сервер, который демонстрирует странное поведение при использовании tr. Вот пример с рабочего сервера:
-bash-3.2$ echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
-bash-3.2$
Это имеет смысл для меня.
Это, однако, с «специального» сервера:
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890
Как видите, удалить все строчные буквы не удается. НО, он удалил букву «о»
Интересная часть - следующие два примера, которые не имеют никакого смысла для меня:
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-n]
opqrstuvwxyz1234567890
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-o]
abcdefghijklmnpqrstuvwxyz1234567890
[root@host~]#
(опять же, 'o' удаляется в последнем примере)
Кто-нибудь знает, что здесь происходит? Я не могу воспроизвести на любой другой Linux-коробке, которую я использую.
shell
command-line
wildcards
tr
Крис
источник
источник
tr
диапазоны записываются без огибающей[...]
. Такtr -d '[a-z]'
что убьютa-z
, а также персонажей[
и]
. Используйте,tr -d a-z
чтобы убить только буквыa-z
.Ответы:
у вас есть файл с именем
o
в текущем каталогеshell расширит
[a-z]
строку, если совпадение найдено.Это называется расширением пути, согласно
man bash
Bash выполнит расширение.
источник
echo
:touch o ; echo tr -d [a-z]
дает это:tr -d o
Что случилось
Оболочка (bash) видит аргумент
[a-z]
. Это шаблон подстановочного знака ( глобус ), который соответствует любой строчной букве¹. Поэтому оболочка ищет имя файла, которое соответствует этому шаблону. Есть три случая:tr
видит аргументы-d
и[a-z]
. Это то, что происходит на большинстве ваших машин.tr
видит аргументы-d
и имя файла. Это происходит на сервере, и соответствующий файл вызывается,o
поскольку мы видим, чтоtr
удалили буквуo
.tr
видит три или более аргумента:-d
и имена файлов. Так какtr
ожидает один аргумент после-d
, он будет жаловаться.Что ты должен был сделать
Если в аргументе команды есть специальные символы, вы должны их избежать. Поместите аргумент в одинарные кавычки
'…'
(это самый простой способ, есть и другие). Внутри одинарных кавычек все символы обозначают самих себя, кроме самой одинарной. Если внутри аргумента есть одиночная кавычка, замените ее на'\''
.Однако обратите внимание, что это, вероятно, все еще не то, что вы имели в виду! Это говорит
tr
об удалении строчных букв и квадратных скобок. Это эквивалентноtr -d ']a-z['
,tr '[]a-z'
и т.д. Для удаления строчных букв, использованиеАргументом
tr
является набор символов. Вы ставите скобки вокруг набора символов в регулярном выражении или шаблоне подстановки, чтобы указать, что это набор символов. Ноtr
работает на одного персонажа одновременно. Его аргументы командной строки - это то, что вы должны поместить в скобки .Вам нужны скобки для обозначения классов символов . В регулярном выражении вы используете квадратные скобки для обозначения класса символов, например,
[[:lower:]]*
соответствует любому количеству строчных букв,[[:lower:]_]*
соответствует любому количеству строчных букв и подчеркиваний. В качестве аргументаtr
вам нужен набор без окружающих его скобок, поэтомуtr -d '[:lower:]'
удаляются строчные буквы,tr -d '[:lower:]_'
удаляются строчные буквы и подчеркивания и т. Д.Some В некоторых регионах он может совпадать с другими символами .
источник
tr -d '[a-z]'
с/usr/bin/tr
. С/usr/xpg4/bin/tr
,tr -d a-z
работает, ноtr -d '[a-z]'
не удаляет[
ни]
./usr/xpg4/bin/tr -d '[a-z]'
не удалял и[
не]
был, по-видимому, исправлен в Solaris 11.