对于文件james
,当我运行此命令时:
cat james | grep ["."]
我只获得包含点的行。
如何只使用点?
获取结束的行?答案 0 :(得分:5)
查找以.
字符结尾的行:
grep '\.$' james
您的cat
命令是unnecessary; grep
能够自行读取文件,并且不需要cat
来完成该作业。
.
字符本身在正则表达式中是特殊的,匹配任何一个字符;你需要使用\
来转义它以匹配文字.
字符。
并且您需要将整个正则表达式括在单引号中,因为\
和$
字符对shell是特殊的。在正则表达式中,$
匹配行的结尾。 (你正在处理一些由shell特别处理的字符,以及由grep
专门处理的其他字符;单引号使shell脱离,这样你就可以控制grep
看到的内容。)
至于你在问题中使用的方括号,这是逃避.
的另一种方式,但这是不寻常的。在正则表达式中,[abc]
匹配a
,b
或c
中的任何一个字符。 [.]
匹配单个文字.
字符,因为.
在方括号内失去了它的特殊含义。您使用的双引号:["."]
是不必要的,因为.
不是shell元字符 - 但方括号 对shell特殊,其含义与它们类似在正则表达式中的含义。所以你的
grep ["."]
相当于
grep [.]
shell通常会将[.]
扩展为包含单个字符.
的每个可见文件名的列表。总是存在这样的文件,即当前目录.
- 但shell的[]
扩展忽略了名称以.
开头的文件。因此,没有任何内容可以展开[.]
,而是grep
将[.]
视为参数,刚刚发生工作,匹配包含的行文字.
字符。 (使用不同的shell,或者使用不同设置的相同shell,可能会搞砸了。)
请注意,shell不会(在某些有限的上下文中除外)处理正则表达式;相反,它使用的文件匹配模式功能较弱。
答案 1 :(得分:1)
您需要使用$
,它表示该行的结尾:
cat james | grep ["."]$
这也有效:
cat james |grep "\.$"
答案 2 :(得分:1)
您可以使用正则表达式。这就是你需要的:
cat james | grep "\.$"
请查看grep联机帮助页以获取有关regexp的更多信息