Что случилось
Оболочка (bash) видит аргумент [a-z]
. Это шаблон подстановочного знака ( глобус ), который соответствует любой строчной букве¹. Поэтому оболочка ищет имя файла, которое соответствует этому шаблону. Есть три случая:
- Ни один файл в текущем каталоге не имеет имени, состоящего из одной строчной буквы. Затем оболочка оставляет шаблон подстановки без изменений и
tr
видит аргументы -d
и [a-z]
. Это то, что происходит на большинстве ваших машин.
- Один файл в текущем каталоге имеет имя, которое представляет собой одну строчную букву. Затем оболочка расширяет шаблон до этого имени файла и
tr
видит аргументы -d
и имя файла. Это происходит на сервере, и соответствующий файл вызывается, o
поскольку мы видим, что tr
удалили букву o
.
- Два или более файлов в текущем каталоге имеют имя, которое представляет собой одну строчную букву. Затем оболочка расширяет шаблон до списка совпадающих имен файлов и
tr
видит три или более аргумента: -d
и имена файлов. Так как tr
ожидает один аргумент после -d
, он будет жаловаться.
Что ты должен был сделать
Если в аргументе команды есть специальные символы, вы должны их избежать. Поместите аргумент в одинарные кавычки '…'
(это самый простой способ, есть и другие). Внутри одинарных кавычек все символы обозначают самих себя, кроме самой одинарной. Если внутри аргумента есть одиночная кавычка, замените ее на'\''
.
tr -d '[a-z]'
Однако обратите внимание, что это, вероятно, все еще не то, что вы имели в виду! Это говорит tr
об удалении строчных букв и квадратных скобок. Это эквивалентно tr -d ']a-z['
, tr '[]a-z'
и т.д. Для удаления строчных букв, использование
tr -d a-z
Аргументом tr
является набор символов. Вы ставите скобки вокруг набора символов в регулярном выражении или шаблоне подстановки, чтобы указать, что это набор символов. Но tr
работает на одного персонажа одновременно. Его аргументы командной строки - это то, что вы должны поместить в скобки .
Вам нужны скобки для обозначения классов символов . В регулярном выражении вы используете квадратные скобки для обозначения класса символов, например, [[:lower:]]*
соответствует любому количеству строчных букв, [[:lower:]_]*
соответствует любому количеству строчных букв и подчеркиваний. В качестве аргумента tr
вам нужен набор без окружающих его скобок, поэтому tr -d '[:lower:]'
удаляются строчные буквы, tr -d '[:lower:]_'
удаляются строчные буквы и подчеркивания и т. Д.
Some В некоторых регионах он может совпадать с другими символами .
tr
диапазоны записываются без огибающей[...]
. Такtr -d '[a-z]'
что убьютa-z
, а также персонажей[
и]
. Используйте,tr -d a-z
чтобы убить только буквыa-z
.