首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UNIX grep with $

UNIX grep with $
EN

Stack Overflow用户
提问于 2013-08-05 21:25:58
回答 4查看 355关注 0票数 0

我有一个简短的问题:

假设我有一个文件,其中包含:

代码语言:javascript
复制
abc$
$
$abc

然后我使用grep "c\$“文件名,然后我只得到abc$。但是如果我使用grep "c\$",我会得到abc$。

我很困惑,反斜杠不是已经关闭了$的特殊含义吗?所以grep "c\$“filename返回行abc$?

真的希望谁能给我一些建议。

在此之前,非常感谢您。

EN

回答 4

Stack Overflow用户

发布于 2013-08-05 21:59:13

双引号把你弄糊涂了。这允许shell扩展元字符。在我的Linux机器上只使用单引号:

代码语言:javascript
复制
$ grep 'abc$' <<<'abc$'
$ grep 'abc\$' <<<'abc$'
$ grep 'abc\$' <<<"abc$"
abc$
$ grep 'abc$' <<<'abc$'
$ grep 'abc\\$' <<<'abc$'
$ 

请注意,在上面的五个命令中,唯一找到该模式(并将其打印出来)的grepabc\$。如果我没有转义$,它会假定我正在查找锚定到行尾的字符串abc。当我在$前面放一个反斜杠时,它将$识别为文字字符,而不是行尾锚点。

请注意,作为行尾锚点的$具有一定的智能性。如果我把$放在正则表达式的中间,它就是一个正则字符:

代码语言:javascript
复制
$ grep 'a$bc' <<<'a$bc'
a$bc
$ grep 'a\$bc' <<<'a$bc'
a$bc

在这里,无论我是否转义了$,它都会找到文字字符串a$bc

用双引号尝试过的东西:

代码语言:javascript
复制
$ grep "abc\$" <<<'abc$'
$ grep "abc\\$" <<<'abc$'
abc$

单个\作为行尾锚点对$进行了转义。将两个\\放在前面,将$作为非外壳元字符和正则表达式文字进行转义。

票数 2
EN

Stack Overflow用户

发布于 2013-08-05 21:32:09

如果您倾向于认为$需要转义,那么事实并非如此。

GNU grep manual中,你会发现:

使用基本正则表达式时需要转义的元字符包括?+{|()

票数 1
EN

Stack Overflow用户

发布于 2013-08-05 22:03:51

如果你想搜索文字$并避免转义$ (这意味着结束行),我建议使用fgrep

代码语言:javascript
复制
fgrep 'abc$' <<< 'abc$'

输出如下:

代码语言:javascript
复制
abc$

PS: fgrepgrep -F相同,并且与man grep相同

-F,-- fixed -strings将模式解释为以换行符分隔的固定字符串的列表,其中任何一个都要匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18059305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档