Linux 如何剥离&;仅来自文件中URL的符号?
我有一个文件,Linux 如何剥离&;仅来自文件中URL的符号?,linux,sed,awk,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>&
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>
我需要从URL中去掉&符号,这样,“/bbq spareribs-&-sauce eat lean-&-fat.html”
就变成了“/bbq spareribs--sauce eat lean--fat.html”
。但是,我不希望从文件中非URL的部分删除&symbol,例如链接的文本,bbq spareribs&sauce(eat lean&fat)
如何在标准Linux安装上实现这一点?对我来说,使用什么特定的工具/语言来实现结果并不重要,只要它有效。一种方法是使用具有XML包的工具/语言。该包将支持以编程方式轻松访问锚元素的href属性。因此,您可能会有以下情况:
aElements = doc.getElement('a')
foreach aElement in aElements {
string url = a.getHref()
removeAmpersane ( url )
}
$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html
我确信几乎所有的语言级工具都有这方面的软件包。如果你愿意使用像语言这样的重型工具,这对你来说会很容易。如果你只是想要较低级别的linux工具,这超出了我的专业知识范围 一种方法是使用具有XML包的工具/语言。该包将支持以编程方式轻松访问锚元素的href属性。因此,您可能会有以下情况:
aElements = doc.getElement('a')
foreach aElement in aElements {
string url = a.getHref()
removeAmpersane ( url )
}
$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html
我确信几乎所有的语言级工具都有这方面的软件包。如果你愿意使用像语言这样的重型工具,这对你来说会很容易。如果你只是想要较低级别的linux工具,这超出了我的专业知识范围 您可以轻松地使用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>
document.onload=(函数(ev){
var links=document.getElementsByTagName('a');
对于(变量i=0;i
您可以轻松地使用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>
document.onload=(函数(ev){
var links=document.getElementsByTagName('a');
对于(变量i=0;i
如果您愿意安装,这个简单的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>
[me@home]$cat your.html | python amp_remover.py
警告:由于我们正在根据解析后的HTML表示重新生成输出HTML,因此格式可能会更改。其他可能的更改包括在标记格式不正确时显式关闭标记
我可能错了,但我怀疑大多数使用正确的XML/HTML解析器的解决方案都会导致类似的问题。要保持文件的原样并只删除有问题的字符,您必须使用基于正则表达式的搜索和删除/替换。除了非常琐碎的模式之外,很多人都会这样做。在您的情况下,这可能是真的,但我还没有被说服。如果您愿意安装,这个简单的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>
[me@home]$cat your.html | python amp_remover.py
警告:由于我们正在根据解析后的HTML表示重新生成输出HTML,因此格式可能会更改。其他可能的更改包括在标记格式不正确时显式关闭标记
我可能错了,但我怀疑大多数使用正确的XML/HTML解析器的解决方案都会导致类似的问题。要保持文件的原样并只删除有问题的字符,您必须使用基于正则表达式的搜索和删除/替换。除了非常琐碎的模式之外,很多人都会这样做。在您的情况下,这可能是真的,但我还没有被说服。如果您决定使用一个简单的命令行正则表达式工具,并且您知道您的URL很好,并且在文本中始终使用符号,您可以尝试以下方法:
aElements = doc.getElement('a')
foreach aElement in aElements {
string url = a.getHref()
removeAmpersane ( url )
}
$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html
这假定URL中与符号相邻的位置没有空格,并且URL中不包含的符号总是被空格包围。因此,这绝不是健壮的,但如果您只需要一次,它可能比安装Beautiful Soup更简单,而且您的html是可预测的。如果您决定使用一个简单的命令行正则表达式工具,并且您知道您的URL很好,并且在文本中始终使用符号,您可以尝试以下方法:
aElements = doc.getElement('a')
foreach aElement in aElements {
string url = a.getHref()
removeAmpersane ( url )
}
$ sed 's/\([^ \t]\)&\([^ \t]\)/\1\2/g' file.html > out.html
这假定URL中与符号相邻的位置没有空格,并且URL中不包含的符号总是被空格包围。因此,这绝不是健壮的,但如果您只需要一次,它可能比安装Beauty Soup更简单,而且您的html是可预测的。为了完整性起见,这是一个awk解决方案。它应足够稳定,以满足以下要求: 简单的任务 文件:
$cat文件
输出:
$ 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>
$awk'BEGIN{FS=OFS=“>”}{for(i=1;i仅仅是为了完整性考虑一个awk解决方案。对于
简单的任务
文件:
$cat文件
输出:
$ 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>
$awk'BEGIN{FS=OFS=“>”}{for(i=1;i