使用外壳程序脚本从HTML页面上的javascript中获取JSON字符串

时间:2018-12-27 15:08:52

标签: json regex shell sed jq

我想用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,然后再使用sedcut,但我认为有更好的方法来使用它。 如果您能指出正确的方向,那就太好了! 谢谢!

2 个答案:

答案 0 :(得分:2)

一种选择可能是使用,至少用于解析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