2010-09-23 211 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)。