Не удается вывести точку с помощью обратного слеша, почему? [duplicate]

Итак, вот команды, которые я выполнил:

$ ~/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 будет присутствовать в выводе, потому что я экранировал точку, но он все еще не считает ее буквальной точкой. Где я ошибаюсь?

1
задан 27 June 2021 в 11:48

1 ответ

Я уверен, что это дубликат какого-то вопроса, но я не могу его найти. В 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 правильно принимала \. .

5
ответ дан 28 July 2021 в 11:24

Другие вопросы по тегам:

Похожие вопросы: