对于文件james
,当我运行此命令时:
cat james | grep ["."]
我只得到包含点的行。
如何仅获取以点结尾的行?
.
要查找以字符结尾的行:
grep '\.$' james
你的cat
命令是不必要的;grep
能够读取文件本身,并且不需要cat
为它做这项工作。
一个.
字符本身在正则表达式中是特殊的,匹配任意一个字符;您需要使用 a 对其进行转义\
以匹配文字.
字符。
并且您需要将整个正则表达式括在单引号中,因为\
and$
字符对于 shell 来说是特殊的。在正则表达式中,$
匹配行尾。(您正在处理一些由 shell 特别处理的字符,以及其他由 特殊处理的字符grep
;单引号使 shell 不碍事,因此您可以控制grep
看到的内容。)
至于您在问题中使用的方括号,这是逃避 的另一种方式.
,但它不寻常。在正则表达式中,[abc]
匹配单个字符,它是a
、b
或c
. [.]
匹配单个文字.
字符,因为.
在方括号内失去其特殊含义。您使用的双引号:["."]
是不必要的,因为.
它不是 shell 元字符——但方括号对 shell 来说是特殊的,其含义与它们在正则表达式中的含义相似。所以你的
grep ["."]
相当于
grep [.]
shell 通常会扩展[.]
为包含单个字符的每个可见文件名的列表.
。总是有这样一个文件,即当前目录.
——但 shell 的[]
扩展会忽略名称以 . 开头的文件.
。因此,由于没有什么可扩展[.]
的,它被单独留下,并被grep
视为[.]
一个参数,它恰好可以工作,匹配包含文字.
字符的行。(使用不同的外壳,或具有不同设置的相同外壳,可能会搞砸。)
请注意,shell 不(在某些有限的上下文中除外)处理正则表达式;相反,它使用功能较弱的文件匹配模式。
您可以使用正则表达式。这就是你需要的:
cat james | grep "\.$"
查看 grep 手册页以获取有关 regexp 的更多信息
您需要使用$
,它表示行尾:
cat james | grep ["."]$
这也有效:
cat james |grep "\.$"