ice*_*owl -3 grep text-processing
我正在尝试grep
使用 Linux 系统 (Deb) 进行夺旗比赛。以下不返回任何结果,我们知道目录中有数百个flag{ }
文本实例。
grep -rnw 'Downloads/' -e 'flag{' | more
Run Code Online (Sandbox Code Playgroud)
为什么?我们如何搜索flag{
?虽然下面工作正常。
grep -rnw 'Downloads/' -e 'flag' | more
Run Code Online (Sandbox Code Playgroud)
使用grep -w
,您要求grep
仅返回紧跟在换行符(在行的开头或结尾处)或非单词字符(单词字符是字母、数字或下划线)之前或之后的匹配项。
这意味着文本this is flag{a}
将不会与grep -w 'flag{
'匹配,因为{
文本中跟在 之后的字符是单词字符。
同样,this is theflag{
不会被 匹配grep -w 'flag{'
。
您可以处理该-w
选项,而是使用明确的零宽度字边界模式,例如在开头,以便您可以匹配flag{a}
但不匹配theflag{
。使用 GNU grep
,这可以使用
grep -rn '\<flag{' Downloads
Run Code Online (Sandbox Code Playgroud)
或者
grep -rn '\bflag{' Downloads
Run Code Online (Sandbox Code Playgroud)
该\<
模式匹配单词开头的单词边界(并\>
在结尾\b
匹配),同时匹配开头和结尾。 \<
and\>
最初继承自ex
和vi
编辑器,比\b
.
GNUgrep
不支持[[:<:]]
and [[:>:]]
(其工作方式与\<
and相同\>
)匹配单词的开头或结尾,但 BSD 支持grep
。BSDgrep
不支持\b
.
Grep with -e
(表示将跟随一个表达式)默认使用基本正则表达式。从man grep
,在“基本与扩展正则表达式”(在线手册)下:
传统
egrep
不支持{
元字符,而一些 egrep 实现支持\{
,因此可移植脚本应避免{
在grep -E
模式中使用并[{]
应用于匹配文字{
.GNU grep
-E
试图通过假设它{
是无效间隔规范的开始并不特殊来支持传统用法。例如,该命令grep -E '{1'
搜索两个字符的字符串,{1
而不是报告正则表达式中的语法错误。POSIX 允许将此行为作为扩展,但可移植脚本应避免它。
所以最便携的选择是:
grep -rnw -e 'flag[{]' 'Downloads/' | more
Run Code Online (Sandbox Code Playgroud)