grep中“+”的问题

Mar*_* KS 7 command-line regex grep

我正在尝试编写一个 grep 命令来在大文本文件中查找如下所示的行:

<div class="node_thumbnail" data-type="file" name="GOPR0036.MP4_frame000001.jpg" data="813334c25191468c9f1c57afc99fde60" aid="133948" rel="/Files/ToolTipView?fileId=813334c25191468c9f1c57afc99fde60&pageNo=1&NoCache=101016083044" rev="topMiddle">
Run Code Online (Sandbox Code Playgroud)

但该+符号似乎在以下命令中引起了问题:

 grep 'data=[a-z,0-9,\"]' file
Run Code Online (Sandbox Code Playgroud)

很多点击

 grep 'data=[a-z,0-9,\"]+' file
Run Code Online (Sandbox Code Playgroud)

没有命中

mur*_*uru 14

如果您想+表示“一个或多个前面的原子”,那么您必须执行以下操作之一:

  1. 使用-E(扩展正则表达式)(或-P,PCRE):

    grep -E 'data=[a-z,0-9,\"]+' file
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转义,+以便在默认情况下使用的基本正则表达式中进行特殊处理grep

    grep 'data=[a-z,0-9,"]\+' file
    
    Run Code Online (Sandbox Code Playgroud)

  • @MartinKS 哎呀,要获得*仅* 字符串,您还需要`-o` 选项。我编辑了我之前的评论。不客气:) (2认同)

hee*_*ayl 9

积分:

  • +是一个 ERE(扩展正则表达式)标记,它指示一个或多个前面的标记,如果使用了-E选项grep或转义(\+) ,则可以使用BRE(基本正则表达式),即仅常规grep

  • 字符类[a-z,0-9,\"]将匹配任何一个字符之间[a-z][0-9],"。这可能不是你想要的

  • 通常grep输出整行,如果只想输出匹配的部分,使用-o选项grep


根据您的示例,您可以执行以下操作:

grep -E '\bdata=[a-z0-9"]+\b' file
Run Code Online (Sandbox Code Playgroud)
  • -E 启用 ERE
  • \b 匹配字符串边缘,零宽度
  • data=data=字面上匹配
  • [a-z0-9"]匹配[a-z], [0-9], 和中的任何字符"+匹配前一个令牌一次或多次

您当前的模式即使您使其正确,\b也不会匹配误报,例如foo fdata=2322abdata=12AB等等。

例子:

% grep -oE '\bdata=[a-z0-9"]+\b' <<<'<div class="node_thumbnail" data-type="file" name="GOPR0036.MP4_frame000001.jpg" data="813334c25191468c9f1c57afc99fde60" aid="133948" rel="/Files/ToolTipView?fileId=813334c25191468c9f1c57afc99fde60&pageNo=1&NoCache=101016083044" rev="topMiddle"'
data="813334c25191468c9f1c57afc99fde60
Run Code Online (Sandbox Code Playgroud)