如何grep大括号'{'?

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)

Kus*_*nda 6

使用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\>最初继承自exvi编辑器,比\b.

GNUgrep不支持[[:<:]]and [[:>:]](其工作方式与\<and相同\>)匹配单词的开头或结尾,但 BSD 支持grep。BSDgrep不支持\b.


Kev*_*use 5

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)