7

我知道,不要使用 curl、grep 和 sed 进行解析。但我正在寻找一种简单的方法,而不是一种非常安全的方法。

所以我得到了一个带有 curl 的 HTML 文件,我需要一个标签中某个属性的值。我使用 grep 让我看到它说的那一行token。这只会发生一次。这给了我一个完整的 div:

<div class="userlinks">
  <span class="arrow flleft profilesettings">settings</span>
  <form class="logoutform" method="post" action="/logout">
    <input class="logoutbtn arrow flright" type="submit" value="Log out">
    <input type="hidden" name="ltoken" value="a5fc8828a42277538f1352cf9ea27a71">
  </form>
</div>

我怎样才能得到值属性(例如“a5fc8828a42277538f1352cf9ea27a71”)?

4

5 回答 5

13

不需要grep:

sed -n '/token/s/.*name="ltoken"\s\+value="\([^"]\+\).*/\1/p' input_file
于 2012-07-17T13:51:56.077 回答
10

一种方法,使用sed

sed "s/.* value=\"\(.*\)\".*/\1/" file.txt

结果:

a5fc8828a42277538f1352cf9ea27a71

高温高压

于 2012-07-17T13:48:31.993 回答
4

使用 XPath 表达式和一些 Grep

您实际上可以从命令行正确解析 HTML。例如,您可以使用xgrep创建 xpath 表达式,然后使用 GNU sed(或您选择的 grep)仅提取您关心的文本。例如:

$ xgrep -x '//input[@name="ltoken"][1]/@value' /tmp/foo |
      sed -rn '/value/ s/.*"([[:xdigit:]]+)"/\1/p'
a5fc8828a42277538f1352cf9ea27a71
于 2012-07-17T15:15:52.830 回答
4

另一种使用方式awk

grep "ltoken" file.txt | awk -F"\"" '{print $6}'

对于不同的属性值,只需增加或减少$6

于 2015-01-22T02:41:57.177 回答
2

xgrep 解决方案存在一个问题,即它需要有效的 xml。由于未关闭的“输入”元素,提供的 html 无效。 xmllint有一个 html 解析器选项,还提供了 string() 函数来提取值而不使用 sed。

$ xmllint --html --xpath 'string(//input[@name="ltoken"][1]/@value)' foo
a5fc8828a42277538f1352cf9ea27a71
于 2014-01-28T12:13:14.640 回答