所以这是我的问题。我需要开发一个小的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中使用开头/结束行字符。
所以我的问题是,我怎样才能正确地整行,包括行特殊字符的开头和结尾,同时也完全匹配“。”字符?
编辑:请注意我确实知道“。”字符需要被转义,但在我的情况下,转义不是一种选择,因为需要对帐户名称进行进一步处理,这会使事情变得太复杂。答案 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)
fgrep
与grep -F
相同。 grep
也有-x
选项,仅与整行匹配。您可以将这些结合起来以获得您想要的结果:
grep -Fx account.test file.txt