如何剥离&仅来自文件中的URL的符号?

时间:2011-09-30 16:15:38

标签: linux sed awk

我有一个文件index.html,其中包含以下数据:

<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-&-fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

我需要去除&amp;来自网址的符号,以使"/bbq-spareribs-&-sauce-eat-lean-&-fat.html"变为"/bbq-spareribs--sauce-eat-lean--fat.html"。但是,我不想删除&amp;来自文件中非URL的部分的符号,例如链接的文本bbq spareribs & sauce (eat lean & fat)

如何在标准Linux安装上完成此操作?对我来说无关紧要的是使用什么特定的工具/语言来实现结果。

5 个答案:

答案 0 :(得分:2)

如果您愿意安装BeautifulSoup,这个简单的Python脚本可能会按您的要求执行:

#!/usr/bin/evn python
import sys
from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(sys.stdin.read())
for a in soup.findAll("a"):
    a["href"] = a["href"].replace("&", "")

print soup

使用示例:

[me@home]$ cat your.html | python amp_remover.py
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

警告:由于我们根据解析后的表示重新生成输出HTML,因此格式可能会发生变化。其他可能的更改包括如果标记格式不正确,则显式关闭标记。

我可能错了,但我怀疑大多数使用正确的XML / HTML解析器的解决方案都会导致类似的问题。要完全保持文件的原样,只删除有问题的字符,您必须最终使用基于正则表达式的搜索并删除/替换。除了非常琐碎的模式之外,许多人都会advice against parsing XML/HTML with regex。在你的情况下,这可能是真的,但我还没有被说服。

答案 1 :(得分:2)

如果你决定使用一个简单的命令行正则表达式工具,并且你知道你的网址很好,并且在文本中一直使用&符号,你可以尝试类似:

$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html

这假设URL没有与&符号相邻的空格,并且不在URL中的&符号总是被空格包围。所以这绝不是强大的,但是如果你只需要一次就可以比安装Beautiful Soup更简单,并且你的html是可预测的。

答案 2 :(得分:1)

为了完整起见,这是一个awk解决方案。它应该足够稳定 简单的任务。

文件:

$ cat file
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-&-fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs-&-sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

输出:

$ awk 'BEGIN{FS=OFS=">"}{for (i=1;i<=NF;i++){if ($i ~ "a href")gsub(/\&/,"",$i)}}1' file
<li><a href="/battered-fried-chicken-breast-no-skin.html">battered fried chicken breast, no skin</a></li>
<li><a href="/bbq-short-ribs-with-sauce.html">bbq short ribs with sauce</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean--fat.html">bbq spareribs & sauce (eat lean & fat)</a></li>
<li><a href="/bbq-spareribs--sauce-eat-lean-only.html">bbq spareribs & sauce (eat lean only)</a></li>

HTH Chris

答案 3 :(得分:0)

一种方法是使用具有XML包的工具/语言。该包将支持以编程方式轻松访问anchor元素的href属性。所以,你可能有类似的东西:

aElements = doc.getElement('a')

foreach aElement in aElements {
 string url = a.getHref()
 removeAmpersane ( url )
}

我确信几乎所有语言级工具都有此包。如果您对语言这样繁重的工具持开放态度,这对您来说很容易。如果你只是想要低级别的linux工具,这超出了我的专业知识。

答案 4 :(得分:0)

您可以轻松地使用javascript:

<head>

<script type="text/javascript">
  document.onload = (function (ev) {
    var links = document.getElementsByTagName('a');
    for (var i = 0; i < links.length; i++) {
      var href = links[i].href.replace(/(&)/, '');
      console.log(links[i]);
    }
  });
</script>

</head>