2010-06-19 128 views
0

我已經試過這無數的方法,時間認輸,並要求主...sed的變量替換

#!/bin/bash 

# Read in the VERSION.header file, this is a plain text file 
# with returns, which in some of my tests, I am loosing the returns and getting 
# one string wrapped only by the shell width 
VERSION_HEADER=`cat VERSION.header` 

sed 's/_VERSION_HEADER_/"$VERSION_HEADER"/g' DOCUMENTATION 

字符串「_VERSION_HEADER_」作爲文件文檔線1當前存在。文件'VERSION.header'有大約18行。

我不會使用sed。我所要做的就是讀取一個作爲模板的文件,將該文件數據存儲爲變量,讀入第二個文件,將其存儲爲變量。在第二個文件中查找標記,用第一個文件中的數據替換標記。

例子:

$貓VERSION.header

hi, this is my header file, how are you today 
good, that is nice, great 
have a nice day, k, thx, bye. 

$貓文檔

_VERSION_HEADER_ 

# This is a documentation file, please read it 
# If you do not read it, you will get stuck to the toilet. 

而且結果應該是:

嗨,這是我的頭文件,你今天好嗎
不錯,那很好,很棒
祝你有美好的一天,k,thx,再見。

#這是一個文檔文件,請閱讀它
#如果你沒有閱讀它,你會被卡在廁所裏。

+0

你有什麼結果? – hudolejev 2010-06-19 11:14:12

+0

[用變量(sed)替換文本](http:// stackoverflow。com/questions/16297052/replace-a-text-with-a-variable-sed) – tripleee 2013-08-30 09:32:42

回答

0
sed -i "s/_VERSION_HEADER_/$VERSION_HEADER/g" DOCUMENTATION 

編輯

對不起,終於得到了你的問題。你有一個多線模式。 This可能會有所幫助。也可以考慮使用Python代替:

#!/usr/bin/env python 

f = open('doc.txt', 'r') 
doc = f.read() 
f.close() 

f = open('VERSION.header', 'r') 
versionHeader = f.read() 
f.close() 

doc = doc.replace('_VERSION_HEADER_', versionHeader) 
print doc 

雖然這可能效率較低。

+0

謝謝,我們現在試圖將它保存在bash中,因此它可以移植到不總是有python的系統。 錯誤:sed:1:「DOCUMENTATION」:D命令末尾的額外字符 – user170579 2010-06-19 18:31:20

-1

怎麼是這樣的:

#!/bin/bash 

while read oneline; do 
    VERSION_HEADER=${VERSION_HEADER}'\n'${oneline}; 
done < VERSION.header 

sed 's/_VERSION_HEADER_/'"${VERSION_HEADER}"'/g' DOCUMENTATION 
1

試試這個:

sed -e '/_VERSION_HEADER_/{r VERSION.header' -e ';d}' DOCUMENTATION 

,讀取文件時,發現模板字符串,然後刪除模板字符串。

+0

我收到一個錯誤:sed:1:「; d} \ n」:d命令末尾的多餘字符 – user170579 2010-06-19 18:38:44

+0

@allentown :它適用於我使用GNU sed 4.2.1。你有什麼版本(以及什麼操作系統和版本)? – 2010-06-19 19:17:52

+0

@ user170579:嘗試不用分號 - 某些版本的「sed」不喜歡它們。 – 2011-01-27 05:45:18

0

AWK

awk 'FNR==NR{s=s" "$0"\n";next}/_VERSION_HEADER_/{$0=s}1' version.header documentation 
0

也許看看男人1版,以及:

# http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed 
[[ $(grep -c _VERSION_HEADER_ DOCUMENTATION) -eq 1 ]] && \ 
cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s DOCUMENTATION 
    H 
    /_VERSION_HEADER_/i 
    . 
    .c 
    . 
    .r VERSION.header 
    wq 
EOF 
0

使用(FreeBSD的)SED做這樣的事情:

VERSION_HEADER="$(sed -E -e 's/\\/\\\\/g' -e 's/&/\\\&/g' -e 's|/|\\/|g' -e 's/$/\\/g' VERSION.header)" 

# note the space after ${VERSION_HEADER} 
sed -E -i "" "/_VERSION_HEADER_/s/_VERSION_HEADER_/${VERSION_HEADER} /" DOCUMENTATION 
0

你需要逃脫您的文字:

text=$(cat VERSION.header); 
escaped_text=$(echo "$text" | sed 's/[/\\&]/\\&/g;s/$/\\/;$s/\\$//') 
sed "s/_VERSION_HEADER_/$escaped_text/g" DOCUMENTATION