Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用URL中的内容查找并替换URL_Bash_Loops_Url_Awk_Sed - Fatal编程技术网

Bash 用URL中的内容查找并替换URL

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

背景信息: 我有一个XML文件,我的供应商每天晚上都会上传新产品和更新库存数量等。 但是他们把我缝合起来了,他们在XML文件中没有描述,他们有一个指向他们网站的链接,该链接的描述是原始文本

我需要做的是有一个脚本,在我从他们那里下载的文档中循环,并用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>