Итак, я выполнил следующие команды:
$ ~/Documents: touch ball.txt bool-txt bowl.txt bull.txt
$ ~/Documents: ls . | grep b..l\.txt
ball.txt
bool-txt
bowl.txt
bull.txt
Я не ожидал, что bool-txt
будет присутствовать в выводе, потому что я ускользнул от точки, но все еще не считал это буквальная точка. В чем я ошибаюсь?
Я уверен, что это дубликат какого-то вопроса, но я не могу его найти. В Unix SE https: //unix.stackexchange .com / questions / 583428 / why-do-i-have-to-quote-an-escape-character-in-a-regular-expression-for-grep-bu
Когда вы используете grep b. .l \ .txt
, оболочка преобразует \.
в .
, поэтому grep получает b..l.txt
, а затем интерпретирует .
как любой персонаж.
Чтобы предотвратить это, самый простой способ - дать grep строку вроде grep 'b..l \ .txt'
, тогда оболочка не избежит точки. Обратите внимание, что одинарные и двойные кавычки делают в bash разные вещи, но в данном случае это не имеет значения. В качестве альтернативы используйте двойную обратную косую черту, чтобы оболочка избегала обратной косой черты как буквального символа и grep правильно принимала \.
.