因此,以下是我运行的命令:
$ ~/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
我确信这是某个问题的重复,但我找不到它。在 Unix SE 上https://unix.stackexchange.com/questions/583428/why-do-i-have-to-quote-an-escaped-character-in-a-regular-expression-for-grep-bu
当您使用 时grep b..l\.txt
,shell 会将其转换\.
为,.
因此 grep 会接收b..l.txt
,然后它会将其解释.
为任何字符。
为了防止这种情况,最简单的方法是给 grep 一个像 这样的字符串grep 'b..l\.txt'
,这样 shell 就不会转义点。请注意,单引号和双引号在 bash 中的作用不同,但在本例中这并不重要。或者,使用双反斜杠,这样 shell 就会将反斜杠转义为文字字符,而 grep 会正确接收\.
。