我想用shell脚本解析的html页面上的javascript中有有效的json。
首先,我想将整个json字符串从{
转换为}
,然后例如可以使用jq
进行解析。
这基本上是我的html的外观:
<!DOCTYPE html>
<html>
<head>
<title>foobar</title>
</head>
<body>
<script type="text/javascript" src="resources/script.js" charset="UTF-8"></script>
<script type="text/javascript" src="resources/resources.js" charset="UTF-8"></script>
<script type="text/javascript">
if( foo.foobar.getInstance().isbar() )
{
foo.bar.Processor.message( {"head":{"url":"anotherfoo;barid=347EDAFA2B136D7825745B0A490DE32"},...});
}
else
{....}
</script>
</body>
</html>
最后,我想获取位于“ barid = ...”的ID。
我一直在尝试先使用grep foo.bar.Processor.message
,然后再使用sed
或cut
,但我认为有更好的方法来使用它。
如果您能指出正确的方向,那就太好了!
谢谢!
答案 0 :(得分:2)
一种选择可能是使用pup,至少用于解析HTML:
< input.html pup 'script:not(:empty) text{}' |
grep foo.bar.Processor.message | grep -o '{.*}' |
jq -r '.head.url
| split(";")[]
| select(test("barid="))
| sub("barid=";"")'
使用您的HTML(已调整以确保HTML中的JSON有效)后,会产生:
347EDAFA2B136D7825745B0A490DE32
当然有很多警告。 YMMV。
答案 1 :(得分:1)
通常,不建议使用unix命令行工具来解析HTML。但是,如果您知道标记字符串$json = @'
[
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
]
'@
$a = $json | ConvertFrom-Json
$b = @{}
$a | ForEach-Object {
$b[$_.Split('-')[0..2] -join '-'] += @($_)
}
$b | ConvertTo-Json
,则可以使用以下foo.bar.Processor.message
解决方案:
sed + jq
sed -n 's/foo\.bar\.Processor\.message(\([^)]*\).*/\1/p' file.html |
jq -r '.head.url | split(";")[1] | split("=")[1]'
在没有347EDAFA2B136D7825745B0A490DE32
的情况下,您可以使用以下jq
解决方案:
sed + gnu grep