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

时间:2013-08-12 17:35:35

标签: unix

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

cat james | grep ["."]

我只获得包含点的行。

如何只使用点?

获取结束的行?

3 个答案:

答案 0 :(得分:5)

查找以.字符结尾的行:

grep '\.$' james

您的cat命令是unnecessary; grep能够自行读取文件,并且不需要cat来完成该作业。

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

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

至于你在问题中使用的方括号,这是逃避.的另一种方式,但这是不寻常的。在正则表达式中,[abc]匹配abc中的任何一个字符。 [.]匹配单个文字.字符,因为.在方括号内失去了它的特殊含义。您使用的双引号:["."]是不必要的,因为.不是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的更多信息