0

我正在努力学习awksed做得更好,以便能够在不需要 PHP、Perl 等东西的情况下创建交叉兼容的终端工具。我现在正在尝试清理一个很长的字符串,它基本上是我使用 .html 获取的 HTML 文档的一部分curl。我想知道解决这个问题的最佳方法。

我发现的大多数解决方案都依赖于静态文件或结构等奢侈品,但是当我试图清理获取的 HTML 代码时,我希望能够假设字符串的“外围”可以改变很多,无论是在尺寸和结构。所以我认为我需要做的基本上是识别 HTML 标签,因为这些标签可能不会改变,并从这些 HTML 标签中提取数据,无论它们在哪里。一个例子可能是这样的:

<span class="unique-class">Payload</span>

我需要能够查找整个 HTML 标记,当找到它时,我需要基本上提取 , 之后的所有内容>,直到<找到 a 并开始另一个标记。

由于我的原始代码基本上是无用的,因为它只是grep匹配某些单词(可能出现在同一页面上非有趣实例中的单词)的行,所以我真的愿意接受任何事情。

4

1 回答 1

1

您很可能需要使用 Regex 来查找所需的字符串段,sed并将awkRegex 作为一个选项,尽管可能需要切换才能这样做。我建议将标签作为整体查找,否则您可能最终会在结束标签和开始标签 ( ) 之间获得代码</span>stuff here<p>,而这可能是您不想要的。

因此,您的正则表达式最基本的可能看起来像这样(未经测试,您可能需要对其进行调整):

/\<[a-zA-z]\>/ /* Find the opening tag. */ 
/\<[/a-zA-z]\>/ /* Find the closing tag, note the presence of the "/" inside the square brackets.
*/

根据您的需要,您可以创建要查找的标签列表,特别是为您提供以下内容:

tags="div|p|article|section" /* Your list of tags, pipe-delimited for OR logic */
/\<$tags[:print:]\>/ /* The regex, looking for something like <div[anything]> */

您可以通过正则表达式为开始标签更进一步,将基本标签存储在变量中,然后找到匹配的结束标签。这可能需要更多的工作才能正常工作,但它确实具有更健壮的优点,并且自然地避免了在错误的结束标记处停止的陷阱(即 - 在</a>应该停止的时候停止</p>)。

一些注意事项 - 这可能会因为一些单字符标签而变得有点麻烦。如果你写得不够聪明,你的程序可能会混淆和之类的东西<a><article>所以要确保你的代码足够健壮来解决这个问题。

另外,不要忘记<input>s 用于生成大多数不同的表单输入,因此如果您关心它们是什么,请确保在type遇到<input>.

最后,你不一定要假设一个标签会有一个结束标签。有些标签没有一个(<br/>/ <br><hr/>/ <hr>),HTML规范并不总是需要它们(<li>并且<p>不需要结束标签,只要下一个开始标签是另一个<li>or <p>,或者后跟父母的结束标签) . 你也不能假设你得到的 HTML 是有效的。因此,请务必考虑这些情况,以免您的应用程序崩溃和烧毁。

于 2013-03-20T13:53:23.983 回答