我使用以下命令从 HTML 中解析表单元素grep
。该$RESP
变量包含先前请求的输出curl
...
echo $RESP | grep -m 1 -o -E 'name="id" value="([A-Za-z0-9]+)"'
它有效,除了它获取 的每个实例name="id"
。页面上有多个表单元素实例。
我尝试使用-m 1
ongrep
在第一场比赛中停止,但它仍然返回所有比赛。
难道我做错了什么?我可以让它工作:
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
也就是说,grep
、head
和cut
远不是完成这项工作的正确工具。使用 xml 解析器来解析 xml。否则你将面临召唤的风险小马