对于文件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 "\.$"