在忽略正则字符串的正则表达式时,为精确字符串打字

时间:2017-10-23 10:49:36

标签: bash grep

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

accounttest
account2
account
accountbtest
account.test

匹配一条确切的线应该很容易,但显然它不是。

我试过了:

grep "^account$" file.txt

输出结果为:

account

因此在这种情况下输出正常,只显示“帐户”。

但如果我尝试:

grep "^account.test$" file.txt

输出结果为:

accountbtest
account.test

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

fgrep account.test file.txt

这次输出正如预期的那样正确:

account.test

但如果我现在尝试怎么办?

fgrep account file.txt

输出:

accounttest
account2
account
accountbtest
account.test

这次输出完全错误,因为我不能在fgrep中使用开头/结束行字符。

所以我的问题是,我怎样才能正确地整行,包括行特殊字符的开头和结尾,同时也完全匹配“。”字符?

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

2 个答案:

答案 0 :(得分:3)

.是正则表达式中的一个特殊字符,在传递给grep时需要进行转义以匹配它作为文字字符串,所以

grep "^account\.test$" file.txt

或者,如果您无法修改搜索字符串,请使用-F中的grep标记将其视为文字字符串,而不在其中进行任何额外处理

grep -Fx 'account.test' file.txt

来自man grep

  

-F--fixed-strings

     

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

     

-x--line-regexp

     

仅选择与整行完全匹配的匹配项。对于正则表达式模式,这就像括号模式,然后用^$围绕它。

答案 1 :(得分:1)

fgrepgrep -F相同。 grep也有-x选项,仅与整行匹配。您可以将这些结合起来以获得您想要的结果:

grep -Fx account.test file.txt