我知道,不要使用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>
如何才能获得value属性(例如“a5fc8828a42277538f1352cf9ea27a71”)?
答案 0 :(得分:10)
没有必要grep:
sed -n '/token/s/.*name="ltoken"\s\+value="\([^"]\+\).*/\1/p' input_file
答案 1 :(得分:8)
单向,使用sed
:
sed "s/.* value=\"\(.*\)\".*/\1/" file.txt
结果:
a5fc8828a42277538f1352cf9ea27a71
HTH
答案 2 :(得分:2)
您实际上可以从命令行正确解析HTML。例如,您可以使用xgrep创建一个xpath表达式,然后使用GNU sed(或您选择的grep)来提取您关注的文本。例如:
$ xgrep -x '//input[@name="ltoken"][1]/@value' /tmp/foo |
sed -rn '/value/ s/.*"([[:xdigit:]]+)"/\1/p'
a5fc8828a42277538f1352cf9ea27a71
答案 3 :(得分:2)
xgrep解决方案存在一个问题,即它需要有效的xml。由于未关闭的“输入”元素,提供的html无效。 xmllint有一个html解析器选项,并提供string()函数来提取值而不使用sed。
$ xmllint --html --xpath 'string(//input[@name="ltoken"][1]/@value)' foo
a5fc8828a42277538f1352cf9ea27a71
答案 4 :(得分:2)
使用awk
grep "ltoken" file.txt | awk -F"\"" '{print $6}'
对于不同的属性值,只需增加或减少$6