grep -m 1 不起作用

grep -m 1 不起作用

我使用以下命令从 HTML 中解析表单元素grep。该$RESP变量包含先前请求的输出curl...

echo $RESP | grep -m 1 -o -E 'name="id" value="([A-Za-z0-9]+)"'

它有效,除了它获取 的每个实例name="id"。页面上有多个表单元素实例。

我尝试使用-m 1ongrep在第一场比赛中停止,但它仍然返回所有比赛。

难道我做错了什么?我可以让它工作:

echo $RESP | grep -m 1 -o -E 'name="id" value="([A-Za-z0-9]+)"' | head -n 1 | cut -d '"' -f4

但是,我仍然不明白为什么-m 1不起作用。

输入示例...

<html>
    ...
    <input type="hidden" name="id" value="4234235325">
    ...
    ...
    <input type="hidden" name="id" value="4234235325">
    ...
    ...
    <input type="hidden" name="id" value="4234235325">
</html>

预期输出:

ID: 4234235325

正如已经提到的,表单元素在整个 HTML 中重复了很多次。我不知道这是糟糕的编码还是优化。但服务器不是我能控制的。

答案1

通过省略 RESP 变量扩展周围最重要的引号,您可以告诉 shell 在空格上拆分数据,尝试通过注入文件名来修改数据,然后将其组合成一行,然后将其传递给 grep。这就是为什么grep -m1给你所有的比赛;它为您提供第一个匹配行的匹配项,该匹配项恰好是所有匹配行,因为它只是一行。

$ var=$'hello\nworld';
$ echo $var
hello world
$ echo "$var"
hello
world
$ echo $var | grep -m1 -o '.o'
lo
wo
$ echo "$var" | grep -m1 -o '.o'
lo

所以引用扩展。echo "$RESP" | grep ...。也可以看看http://mywiki.wooledge.org/Arguments

也就是说,grepheadcut远不是完成这项工作的正确工具。使用 xml 解析器来解析 xml。否则你将面临召唤的风险小马

相关内容