在忽略点字符的正则表达式时搜索精确字符串

Ton*_*ony 4 bash grep

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

accounttest
account2
account
accountbtest
account.test
Run Code Online (Sandbox Code Playgroud)

匹配一条精确的线应该很容易,但显然事实并非如此。

我试过:

grep "^account$" file.txt
Run Code Online (Sandbox Code Playgroud)

输出是:

account
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,输出是可以的,只显示“帐户”。

但如果我尝试:

grep "^account.test$" file.txt
Run Code Online (Sandbox Code Playgroud)

输出是:

accountbtest
account.test
Run Code Online (Sandbox Code Playgroud)

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

fgrep account.test file.txt
Run Code Online (Sandbox Code Playgroud)

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

account.test
Run Code Online (Sandbox Code Playgroud)

但如果我现在尝试:

fgrep account file.txt
Run Code Online (Sandbox Code Playgroud)

输出:

accounttest
account2
account
accountbtest
account.test
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是,如何正确地搜索整行,包括行的开头和结尾特殊字符,同时还完全匹配“。” 特点?

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

Ini*_*ian 5

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

grep "^account\.test$" file.txt
Run Code Online (Sandbox Code Playgroud)

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

grep -Fx 'account.test' file.txt
Run Code Online (Sandbox Code Playgroud)

man grep

-F, --fixed-strings

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

-x, --line-regexp

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