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
如果您想+表示“一个或多个前面的原子”,那么您必须执行以下操作之一:
使用-E(扩展正则表达式)(或-P,PCRE):
grep -E 'data=[a-z,0-9,\"]+' file
Run Code Online (Sandbox Code Playgroud)转义,+以便在默认情况下使用的基本正则表达式中进行特殊处理grep:
grep 'data=[a-z,0-9,"]\+' file
Run Code Online (Sandbox Code Playgroud)积分:
+是一个 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=2322ab,data=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)