2010-06-19 127 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