![“ls -a | grep ^\.”的奇怪行为](https://linux22.com/image/62496/%E2%80%9Cls%20-a%20%7C%20grep%20%5E%5C.%E2%80%9D%E7%9A%84%E5%A5%87%E6%80%AA%E8%A1%8C%E4%B8%BA.png)
我想列出密码的内容并仅显示以点开头的文件。我尝试过ls -a | grep ^\.
,但我无法弄清楚为什么输出还包含不以点开头的文件。例如:
Pictures
.pip
.pki
.profile
projects
Public
我知道我可以实现我想要的,ls -ld .*
我只是对 grep 的这种行为感到好奇,我无法解释。
答案1
引用 的参数grep
,因此ls -a | grep '^\.'
原因是 shell 处理\.
并将其转回 plain .
,grep
然后将其视为单字符通配符。如果有疑问,请始终引用包含(或可能包含)shell 特有字符的字符串。
答案2
答案3
如果执行cmdls -a | grep ^\.那么 grep 不会将“\”视为特殊字符和“.”的含义不要逃脱。
当我们使用cmd时ls -a | grep "^\."那么 grep 将“\”视为特殊字符和“.”的含义逃脱了。它会给你一个预期的结果。
如果你想使用不带引号的 grep cmd,那么你也应该转义“\”字符。通过以下命令,您可以获得不带双引号的预期结果。 ls -a | grep ^\\.
有关正则表达式中特殊字符含义的详细信息,请参阅以下链接。 http://www.regular-expressions.info/quickstart.html