bash模板

时间:2010-09-23 18:07:01

标签: bash sed

我有一个带有var LINK的模板 和一个数据文件links.txt,每行一个网址

如何在bash中我可以用link.txt的内容替换LINK?

如果我这样做

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

两个问题:

  1. $ LINKS的内容为links.txt,不带换行符

  2. sed:1:“s / LINKS / http:// test ...”:替换命令中的错误标志:'/'

  3. sed没有在links.txt文件中转义//

    感谢

4 个答案:

答案 0 :(得分: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解决方案 - 你会遇到同样的问题,除非你在网址中发现不允许的东西(但你是否在验证?)如果你没有,你已经有另一个问题 - 链接可以包含<>并打破你的xml。

答案 1 :(得分:1)

您可以使用ed

执行此操作
ed template.xml <<EOF
/LINKS/d
.r links.txt
w output.txt
EOF
  • 第一个命令将转到该行 包含LINKS并将其删除。
  • 第二行将插入 当前的links.txt内容 线。
  • 第三个命令将写入文件 到output.txt(如果你省略output.txt 编辑将保存到 TEMPLATE.XML)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

请注意,我还添加了\n以添加其他换行符。

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