Что случилось
Оболочка (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.