2010-09-23 86 views
0

我有一个模板,用VAR LINK 和数据文件,links.txt,每行庆典模板

一个URL如何在bash,我可以代替LINK与links.txt的内容?

,如果我做

#!/bin/bash 
LINKS=$(cat links.txt) 
sed "s/LINKS/$LINK/g" template.xml 

二题:

  1. $ LINKS具有links.txt的不换行的内容

  2. 的sed:1:“S /链接/ HTTP :// test ...“:替代命令中的坏标志:'/'

SED不逃避//在links.txt文件

感谢

+0

你能发表一个你的links.txt和template.xml文件是什么样子的例子吗? – bta 2010-09-23 18:10:40

回答

0

尝试运行sed两次。在第一次运行中,将/替换为\/。第二次运行将与您目前的运行相同。

+1

这是不必要的。您不必使用/字符替换。你可以使用任何你想要的字符,所以选择一个不会与URL冲突的字符。例如S | A | B |或者s $ a $ b $等等。(注意:我不知道if和$是否是无效的URL字符 - 我只是将它们用作与/不同的字符的示例) – camh 2010-09-23 22:57:58

+0

@ camh-好点。 '$'字符是一个有效的URL字符,所以我会用'|'或'^'去。 – bta 2010-09-24 16:58:56

0

sed命令中's'后面的字符结束了分隔符,因此您需要使用$LINK值中不存在的字符。例如,你可以尝试一个逗号:

sed "s,LINKS,${LINK}\n,g" template.xml 

请注意,我还添加了\n增加一个额外的换行符。

另一种选择是在$ LINK中转义正斜杠,可能使用sed。如果您对$ LINK中的字符没有保证,这可能会更安全。

2

改用一些更好的语言。我会为bash + awk编写一个解决方案......但这太费劲了。 (如果您真的想这么做,请参阅http://www.gnu.org/manual/gawk/gawk.html#Getline_002fVariable_002fFile

只需使用任何语言,您不必混合使用控制和内容文本。例如在python:

#!/usr/bin/env python 
links = open('links.txt').read() 
template = open('template.xml').read() 
print template.replace('LINKS', links) 

当心,如果你试图迫使其他一些分隔SED解决方案 - 你会进入,除非你找到的东西在URL中(但不允许你验证了同样的问题? )如果你不这样做,你已经有了另一个问题 - 链接可能包含<>并破坏你的xml。

1

可以使用ed做到这一点:

ed template.xml <<EOF 
/LINKS/d 
.r links.txt 
w output.txt 
EOF 
  • 第一条命令会去行 包含链接并将其删除。
  • 第二行将在当前的 行中插入 links.txt的内容。
  • 第三个命令会将文件 写入output.txt(如果省略了输出。txt 编辑将被保存到 template.xml)。