Bash 用URL中的内容查找并替换URL
背景信息: 我有一个XML文件,我的供应商每天晚上都会上传新产品和更新库存数量等。 但是他们把我缝合起来了,他们在XML文件中没有描述,他们有一个指向他们网站的链接,该链接的描述是原始文本Bash 用URL中的内容查找并替换URL,bash,loops,url,awk,sed,Bash,Loops,Url,Awk,Sed,背景信息: 我有一个XML文件,我的供应商每天晚上都会上传新产品和更新库存数量等。 但是他们把我缝合起来了,他们在XML文件中没有描述,他们有一个指向他们网站的链接,该链接的描述是原始文本 我需要做的是有一个脚本,在我从他们那里下载的文档中循环,并用URL的内容替换URL 例如,如果我有 <DescriptionLink>http://www.leadersystems.com.au/DataFeed/ProductDetails/AT-CHARGERSTATION-45</D
我需要做的是有一个脚本,在我从他们那里下载的文档中循环,并用URL的内容替换URL 例如,如果我有
<DescriptionLink>http://www.leadersystems.com.au/DataFeed/ProductDetails/AT-CHARGERSTATION-45</DescriptionLink>
http://www.leadersystems.com.au/DataFeed/ProductDetails/AT-CHARGERSTATION-45
我希望它最终成为
<DescriptionLink>Astrotek USB Charging Station Charger Hub 3 Port 5V 4A with 1.5m Power Cable White for iPhone Samsung iPad Tablet GPS</DescriptionLink>
Astrotek USB充电站充电器集线器3端口5V 4A,带1.5m电源线,适用于iPhone三星iPad平板电脑GPS
我尝试过一些方法,但我对脚本或循环不是很精通。
到目前为止,我已经:
#!/bin/bash
LINKGET=`awk -F '|' '{ print $2 }' products-daily.txt`
wget -O products-daily.txt http://www.suppliers-site-url.com
sed 's/<DescriptionLink>*/<DescriptionLink>$(wget -S -O- $LINKGET/g' products-daily.txt
#/bin/bash
LINKGET=`awk-F'|'{print$2}'products-daily.txt`
wget-O products-daily.txthttp://www.suppliers-site-url.com
sed's/*/$(wget-s-O-$LINKGET/g'products-daily.txt
但是,我也不确定这一切到底是如何运作的,所以这是反复试验。
感谢您的帮助
已更新以包含示例URL。您将需要类似的内容(将GNU awk用于第三个要匹配的参数()):
$cat tst.awk
{
head=“”
尾部=编码($0)
while(匹配(tail,/^([^{]*[{])([^}]+)(.*)/,a)){
desc=“”
cmd=“curl-s\047”a[2]“\047”
而((cmd | getline)>0){
描述=(描述==“”?“”:描述)行
}
关闭(cmd)
头=头解码(a[1])描述
尾=a[3]
}
打印头解码(尾部)
}
函数编码(str){
gsub(/@/,“@A”,str)
gsub(/{/,“@B”,str)
gsub(/}/,“@C”,str)
gsub(/,“{”,str)
gsub(/,“}”,str)
返回str
}
函数解码(str){
gsub(/}/,“”,str)
gsub(/{/,“”,str)
gsub(/@C/,“}”,str)
gsub(/@B/,“{”,str)
gsub(/@A/,“@”,str)
返回str
}
$awk-f tst.awk文件
Astrotek USB充电站充电器集线器3端口5V 4A,带1.5m电源线,适用于iPhone三星iPad平板电脑GPS
有关编码/解码功能正在执行的操作及其原因的信息,请参阅
请注意,这是使用
getline
比较合适的极少数情况之一。如果您将来考虑使用getline
,请确保阅读并完全理解最初讨论的所有注意事项和用例。您能提供一个url示例吗?否则很难测试…添加的url例如:)在我的文件中的5000多个条目上运行此命令时,我收到一个错误,它是fatal:cannotopenpipe`curl-s(打开的文件太多)
有什么想法吗?是的,每次调用后我都忘了关闭管道,就像我在回答底部引用的那篇文章中所显示的那样(请参见a)从管道中读取。现在已修复。
$ cat tst.awk
{
head = ""
tail = encode($0)
while ( match(tail,/^([^{]*[{])([^}]+)(.*)/,a) ) {
desc = ""
cmd = "curl -s \047" a[2] "\047"
while ( (cmd | getline line) > 0 ) {
desc = (desc=="" ? "" : desc ORS) line
}
close(cmd)
head = head decode(a[1]) desc
tail = a[3]
}
print head decode(tail)
}
function encode(str) {
gsub(/@/,"@A",str)
gsub(/{/,"@B",str)
gsub(/}/,"@C",str)
gsub(/<DescriptionLink>/,"{",str)
gsub(/<\/DescriptionLink>/,"}",str)
return str
}
function decode(str) {
gsub(/}/,"</DescriptionLink>",str)
gsub(/{/,"<DescriptionLink>",str)
gsub(/@C/,"}",str)
gsub(/@B/,"{",str)
gsub(/@A/,"@",str)
return str
}
$ awk -f tst.awk file
<DescriptionLink>Astrotek USB Charging Station Charger Hub 3 Port 5V 4A with 1.5m Power Cable White for iPhone Samsung iPad Tablet GPS</DescriptionLink>