Bash 在忽略点字符的正则表达式时对精确字符串进行Grepping

Bash 在忽略点字符的正则表达式时对精确字符串进行Grepping,bash,grep,Bash,Grep,这是我的问题。我需要开发一个小的bash脚本,它可以grep包含帐户名的文件(我们称之为file.txt)。内容如下: accounttest account2 account accountbtest account.test 匹配一条精确的线应该很容易,但显然它真的不容易 我试过: grep "^account$" file.txt 输出为: account accountbtest account.test 因此,在这种情况下,输出正常,只显示“account” 但如果我尝试: g

这是我的问题。我需要开发一个小的bash脚本,它可以grep包含帐户名的文件(我们称之为file.txt)。内容如下:

accounttest
account2
account
accountbtest
account.test
匹配一条精确的线应该很容易,但显然它真的不容易

我试过:

grep "^account$" file.txt
输出为:

account
accountbtest
account.test
因此,在这种情况下,输出正常,只显示“account”

但如果我尝试:

grep "^account.test$" file.txt
输出为:

account
accountbtest
account.test
因此,为了停止将点字符解释为“任何字符”,我们想到的下一个明显的解决方案是使用fgrep,对吗

fgrep account.test file.txt
正如预期的那样,这次的输出是正确的:

account.test
但如果我现在就尝试:

fgrep account file.txt
输出:

accounttest
account2
account
accountbtest
account.test
这次输出是完全错误的,因为我不能在fgrep中使用开始/结束行字符

所以我的问题是,我怎样才能正确地grep一整行,包括行首和行尾的特殊字符,同时也完全匹配“.”字符


编辑:请注意,我确实知道“.”字符需要转义,但在我的情况下,转义不是一个选项,因为需要对帐户名进行进一步处理,这会使事情变得太复杂。

在正则表达式表示法中,
是一个特殊字符,在传递到
grep
时,需要对其进行转义,以将其作为文本字符串进行匹配

grep "^account\.test$" file.txt
或者,如果您无法修改搜索字符串,请使用
grep
中的
-F
标志将其视为文字字符串,而不在其中进行任何额外处理

grep -Fx 'account.test' file.txt
man grep

-F
-固定字符串

模式
解释为固定字符串(而不是正则表达式)的列表,由新行分隔,其中任何一个都要匹配

-x
-行regexp

仅选择与整行完全匹配的匹配项。对于正则表达式模式,这类似于将模式括起来,然后用
^
$
包围它


fgrep
grep-F
相同
grep
还有
-x
选项,该选项仅与整行匹配。您可以将这些功能组合在一起以获得所需的功能:

grep -Fx account.test file.txt

我可能应该说明这一点。我知道它必须转义,但正如我所说的,文件的内容是可变的,在我的特殊情况下,很难转义。引用点与shell处理无关。它不是引用“在传递给grep之前”,而是由grep自己处理。点是正则表达式中的一个特殊字符,因此如果您想删除该特殊性质并按字面意思使用它,则需要将其引用。您已经显示了几种不同的输出,但您实际需要的输出是什么?非常感谢,camh!这正是我想要的。