如何在shell脚本中修复字符串(删除

时间:2016-01-07 18:31:14

标签: string shell parsing awk sed

我正在使用shell脚本对一个cablemodem的HTML诊断页面源代码进行webscraping,我需要修复一些由Motorola完成的编码错误。在许多页面中有一些事件在输入标记的末尾缺少结束>,这会破坏事物。由于</td>之前的值是动态的,我需要能够动态修复标记。

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

通过value=253 </td>

查看结果如何

如何用“&gt;”替换该空格对于整个页面中的每一次出现?请注意,在这些网页中,</td>前面有一个空格,因此sed 's/ <\/td>/><\/td>/g'将无法正常工作。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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

要解析HTML,您需要使用DOM解析器。我建议使用XPath。从Linux上的命令行,您可以使用.config(function(uiGmapGoogleMapApiProvider) { var $injector = angular.injector(['ng']) var $http = $injector.get('$http') $http.get(<url to your key>) .then(function(rsp){ var data = rsp; uiGmapGoogleMapApiProvider.configure({ key: data.key, v: '3.20', //defaults to latest 3.X anyhow libraries: 'weather,geometry,visualization' }) }) }) ,它是包xmllint的一部分。通过libxml2-utils(Linux上常见的xml库)可用的DOM解析器可以解析上面的无效输入。

假设您要提取输入值:

libxml2

它会报告HTML解析错误,您可以将其重定向到xmllint --html --xpath '//input[@name="NumberOfCpes"]/@value' test.html

/dev/null

但仍然在stdout上给你正确的值:

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

然而,当然令人讨厌的是网站产生无效的HTML。

答案 1 :(得分:0)

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>`