对于该文件james
,当我运行此命令时:
cat james | grep ["."]
Run Code Online (Sandbox Code Playgroud)
我只得到包含点的线条.
如何只获得以点结尾的行?
要查找以.
字符结尾的行:
grep '\.$' james
Run Code Online (Sandbox Code Playgroud)
你的cat
命令是不必要的 ; grep
能够读取文件本身,而不需要cat
为它做这项工作.
一个.
字符本身在正则表达式中是特殊的,匹配任何一个字符; 你需要使用a \
来匹配文字.
字符来逃避它.
并且您需要将整个正则表达式括在单引号中,因为\
和$
字符对于shell是特殊的.在正则表达式中,$
匹配行的结尾.(你正在处理一些由shell专门处理的字符,以及其他经过特殊处理的字符grep
;单引号会使shell脱离,这样你就可以控制grep
看到的内容了.)
至于你在问题中使用的方括号,这是逃避它的另一种方式.
,但这是不寻常的.在正则表达式,[abc]
匹配单个字符的任何a
,b
或c
.[.]
匹配单个文字.
字符,因为.
它在方括号内失去了它的特殊含义.您使用的双引号:["."]
是不必要的,因为.
它不是shell元字符 - 但方括号对于shell 是特殊的,具有与它们在正则表达式中的含义相似的含义.所以你的
grep ["."]
Run Code Online (Sandbox Code Playgroud)
相当于
grep [.]
Run Code Online (Sandbox Code Playgroud)
shell通常会扩展[.]
为包含单个字符的每个可见文件名的列表.
.总有这样一个文件,即当前目录.
- 但shell的[]
扩展会忽略名称以其开头的文件.
.因此,由于没有任何东西可以扩展[.]
,所以它是独立的,并且grep
看作[.]
是一个参数,恰好可以工作,匹配包含文字.
字符的行.(使用不同的shell,或者使用不同设置的相同shell,可能会搞砸了.)
请注意,shell不会(在某些有限的上下文中除外)处理正则表达式; 而是使用文件匹配模式,这些模式功能较弱.
归档时间: |
|
查看次数: |
2874 次 |
最近记录: |