所以这是我的问题。我需要开发一个小的 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 中使用开始/结束行字符。
所以我的问题是,如何正确地搜索整行,包括行的开头和结尾特殊字符,同时还完全匹配“。” 特点?
编辑:请注意,我确实知道“。” 字符需要转义,但在我的情况下,转义不是一种选择,因为需要对帐户名称进行进一步处理,这会使事情变得过于复杂。
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仅选择与整行完全匹配的那些匹配项。对于正则表达式模式,这就像将模式括起来,然后用
^和包围它$。
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |