3

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

cat james | grep ["."]

我只得到包含点的行。

如何仅获取以点结尾的行?

4

3 回答 3

5

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

grep '\.$' james

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

一个.字符本身在正则表达式中是特殊的,匹配任意一个字符;您需要使用 a 对其进行转义\以匹配文字.字符。

并且您需要将整个正则表达式括在单引号中,因为\and$字符对于 shell 来说是特殊的。在正则表达式中,$匹配行尾。(您正在处理一些由 shell 特别处理的字符,以及其他由 特殊处理的字符grep;单引号使 shell 不碍事,因此您可以控制grep看到的内容。)

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

grep ["."]

相当于

grep [.]

shell 通常会扩展[.]为包含单个字符的每个可见文件名的列表.。总是有这样一个文件,即当前目录.——但 shell 的[]扩展会忽略名称以 . 开头的文件.。因此,由于没有什么可扩展[.]的,它被单独留下,并被grep视为[.]一个参数,它恰好可以工作,匹配包含文字.字符的行。(使用不同的外壳,或具有不同设置的相同外壳,可能会搞砸。)

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

于 2013-08-12T19:29:43.333 回答
1

您可以使用正则表达式。这就是你需要的:

cat james | grep "\.$"

查看 grep 手册页以获取有关 regexp 的更多信息

于 2013-08-12T17:40:14.863 回答
1

您需要使用$,它表示行尾:

cat james | grep ["."]$

这也有效:

cat james |grep "\.$"
于 2013-08-12T17:39:53.363 回答