【问题标题】:How can I fix a string in shell script (remove如何修复 shell 脚本中的字符串(删除
【发布时间】:2016-04-12 06:45:10
【问题描述】:

我正在使用 shell 脚本对 cablemodem 的 HTML 诊断页面源代码进行网络抓取,我需要修复一些由摩托罗拉完成的编码错误。在许多页面中,有少数情况在输入标签末尾缺少结束 >,这会破坏事物。由于</td> 前面的值是动态的,我需要能够动态修复标签。

示例字符串: <td bgcolor=#E7DAAC width=138 colspan=2><input type="text" name="NumberOfCpes" size="3" maxlength="3" value=253 </td>

value=253 </td>看看结局如何

如何在整个页面中的每次出现都用“>”替换该空格?请记住,在这些页面中还有其他地方 </td> 前面有一个空格,因此 sed 's/ <\/td>/><\/td>/g' 将无法正常工作。

感谢您的帮助

【问题讨论】:

  • 你需要支持<td name="<ugly_with_brace_in_name">这样的东西吗?如果没有,您可以执行s/<(.*)</<\1/></g 之类的操作,即两个打开<'s = </><
  • @TomaszLewowski 它应该是s/<([^<*])</<\1></g,因为* 匹配贪婪。
  • @hek2mgl 感谢您的更正
  • @hek2mgl @TomaszLewowski 猫 temp.html | sed 's/' sed: -e expression #1, char 19: invalid reference \1 on `s' 命令的 RHS 我错过了什么吗?跨度>
  • @vizi0n 您需要使用sed -r ... 或转义括号。还要检查我的答案。

标签: string shell parsing awk sed


【解决方案1】:

使用 sed 的正则表达式和替换方法

sed -r 's#(<input[^>]+)[[:space:]]*<#\1>#g;s#[[:space:]]+([>])#\1#g'

如果你有下面的例子

<td bgcolor=#E7DAAC width=138 colspan=2><input type="text" name="NumberOfCpes" size="3" maxlength="3" value=253       </td>

你的输出将是

<td bgcolor=#E7DAAC width=138 colspan=2><input type="text" name="NumberOfCpes" size="3" maxlength="3" value=253>/td>`

【讨论】:

    【解决方案2】:

    虽然它不是格式良好的 HTML,但它不应该破坏您的工具 - 如果您使用的是正确的工具。

    要解析 HTML,您需要使用 DOM 解析器。我建议与它一起使用 XPath。在 Linux 的命令行中,您可以使用 xmllint,它是包 libxml2-utils 的一部分。通过libxml2(Linux上常用的xml库)提供的DOM解析器可以解析上述无效输入。

    假设您要提取输入值:

    xmllint --html --xpath '//input[@name="NumberOfCpes"]/@value' test.html
    

    它报告一个 HTML 解析错误,您可以将其重定向到 /dev/null:

    xmllint --html --xpath '//input[@name="NumberOfCpes"]/@value' test.html 2>/dev/null
    

    但仍然在标准输出上为您提供正确的值:

    value="253"
    

    当然,网站生成无效的 HTML 确实很烦人。

    【讨论】:

    • 也许我说“解析”没有很好地表达自己。我要么在源代码中获取一些信息,要么使用 grep 和 sed 从 lynx 转储 HTML 输出,我找到了我需要的东西。这个损坏的标签会导致 lynx 在转储的输出上显示一个空的输入框。对我来说,DOM 解析器可能看起来有点矫枉过正,至少在短期内如此。但我会在以后研究这一点以供学习。谢谢
    • 哈哈!您正在使用 Lynx 并说 DOM 解析器(如 xmllint)是开销?! lynx 如何解析 HTML?魔法?
    • 我使用 wget 或 lynx 从调制解调器中获取 HTML 源代码,或者如果我只需要转储浏览器输出,则使用直接 lynx。我需要的一些信息不在特定的标签中,只是纯文本,所以我经常使用 grep、sed 和 cut。也许解析不是我所做的正确术语。
    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2016-11-14
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多