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

仅用于结束字符的grep命令的Unix语法,unix,Unix,对于文件james,当我运行此命令时: cat james | grep ["."] 我只得到包含点的线 如何仅获取以点结尾的行?您需要使用$,这表示行的结尾: cat james | grep ["."]$ 这也适用于: cat james |grep "\.$" 可以使用正则表达式。这就是您需要的: cat james | grep "\.$" 查看grep手册页了解有关regexp的更多信息,以查找以字符结尾的行: grep '\.$' james 您的cat命令为grep能够读

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

cat james | grep ["."]
我只得到包含点的线


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

您需要使用
$
,这表示行的结尾:

cat james | grep ["."]$
这也适用于:

cat james |grep "\.$"

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

cat james | grep "\.$"

查看grep手册页了解有关regexp的更多信息,以查找以
字符结尾的行:

grep '\.$' james
您的
cat
命令为
grep
能够读取文件本身,并且不需要
cat
为其执行该工作

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

您需要将整个正则表达式括在单引号中,因为
\
$
字符是shell特有的。在正则表达式中,
$
匹配行尾。(您正在处理一些由shell专门处理的字符,以及另一些由
grep
专门处理的字符;单引号使shell不受影响,因此您可以控制
grep
看到的内容。)

至于你在问题中使用的方括号,这是另一种逃避
的方法,但这是不寻常的。在正则表达式中,
[abc]
匹配
a
b
c
中任意一个字符
[.]
匹配单个文本
字符,因为
在方括号内失去了其特殊含义。您使用的双引号:
[“]
是不必要的,因为
不是shell元字符——但方括号对于shell是特殊的,其含义与正则表达式中的含义类似。那么你的

grep ["."]
相当于

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


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

仅供参考,您无需调用cat。只要
grep[“”]james
就行了。@squiguy:是的,但根本不清楚
grep[“”]
为什么行。参见我的答案。
-E
不是必需的<代码>“\.$”
不是扩展正则表达式语法的一部分。单引号比双引号好<代码>$是一个shell元字符。(在这种情况下,shell不会特别处理
$
)您删除了
-E
,但仍然使用双引号和不必要的
cat