grep命令的Unix语法仅用于结束字符

shm*_*nsw 3 unix

对于该文件james,当我运行此命令时:

cat james | grep ["."]
Run Code Online (Sandbox Code Playgroud)

我只得到包含点的线条.

如何只获得以点结尾的行?

Kei*_*son 5

要查找以.字符结尾的行:

grep '\.$' james
Run Code Online (Sandbox Code Playgroud)

你的cat命令是不必要的 ; grep能够读取文件本身,而不需要cat为它做这项工作.

一个.字符本身在正则表达式中是特殊的,匹配任何一个字符; 你需要使用a \来匹配文字.字符来逃避它.

并且您需要将整个正则表达式括在单引号中,因为\$字符对于shell是特殊的.在正则表达式中,$匹配行的结尾.(你正在处理一些由shell专门处理的字符,以及其他经过特殊处理的字符grep;单引号会使shell脱离,这样你就可以控制grep看到的内容了.)

至于你在问题中使用的方括号,这是逃避它的另一种方式.,但这是不寻常的.在正则表达式,[abc]匹配单个字符的任何a,bc.[.]匹配单个文字.字符,因为.它在方括号内失去了它的特殊含义.您使用的双引号:["."]是不必要的,因为.它不是shell元字符 - 但方括号对于shell 特殊的,具有与它们在正则表达式中的含义相似的含义.所以你的

grep ["."]
Run Code Online (Sandbox Code Playgroud)

相当于

grep [.]
Run Code Online (Sandbox Code Playgroud)

shell通常会扩展[.]为包含单个字符的每个可见文件名的列表..总有这样一个文件,即当前目录.- 但shell的[]扩展会忽略名称以其开头的文件..因此,由于没有任何东西可以扩展[.],所以它是独立的,并且grep看作[.]是一个参数,恰好可以工作,匹配包含文字.字符的行.(使用不同的shell,或者使用不同设置的相同shell,可能会搞砸了.)

请注意,shell不会(在某些有限的上下文中除外)处理正则表达式; 而是使用文件匹配模式,这些模式功能较弱.